根据 eff 和 exp 日期对 return 单行进行 Hive 查询
Hive query to return single row based on eff and exp date
我有一个 table 包含以下数据。
我希望需要返回的行是 exp_dt“2020-09-22”。但是当下面的 运行 查询时,它返回两行。我不明白为什么它在具有 eff_dt“2020-09-19”时也返回第一行。
select id,cd,eff_dt,exp_dt,post_dt from table
where from_unixtime(unix_timestamp(eff_dt,"yyyy-MM-dd")) <= from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
and from_unixtime(unix_timestamp(exp_dt,"yyyy-MM-dd")) >= from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"));
我的查询有问题吗?我期待返回第二行。
使用 <
与 exp_date
进行比较:
select id,cd,eff_dt,exp_dt,post_dt
from table
where from_unixtime(unix_timestamp('2020-09-21', 'yyyy-MM-dd')) >= from_unixtime(unix_timestamp(eff_dt, 'yyyy-MM-dd')) and
from_unixtime(unix_timestamp('2020-09-22', 'yyyy-MM-dd')) < from_unixtime(unix_timestamp(exp_dt, 'yyyy-MM-dd'))
我把比较顺序颠倒了。我发现先用常量来遵循逻辑更容易。
这是否捕捉了同一天到期的边缘情况并同时解决了您的问题?
select id,cd,eff_dt,exp_dt,post_dt from table
where
(from_unixtime(unix_timestamp(eff_dt,"yyyy-MM-dd")) <= from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
and
from_unixtime(unix_timestamp(exp_dt,"yyyy-MM-dd")) > from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
)
or
(from_unixtime(unix_timestamp(eff_dt,"yyyy-MM-dd")) = from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
and
from_unixtime(unix_timestamp(exp_dt,"yyyy-MM-dd")) = from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
)
;
事实上我怀疑 exp 总是 >= eff,所以可能只有一个条件
from_unixtime(unix_timestamp(eff_dt,"yyyy-MM-dd")) <= from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
够了...?
您不需要 from_unixtime(unix_timestamp()),因为日期已经是正确的格式并且参数是相同的 yyyy-MM-dd 格式。
您查询中的问题是您对 eff 和 exp 日期都使用了 equal
要查找日期的最新记录,请使用此查询:
select id,cd,eff_dt,exp_dt,post_dt from table
where eff_dt <= "2020-09-21"
and exp_dt > "2020-09-21";
当SCD2中eff_dt = exp_dt时,如果你只有日期(没有时间成分),应该没有记录。只有当你使用时间戳时,日期才能相等,而时间不同,在这种情况下,在检查之前将你的参数日期转换为时间戳。
SCD2 的设计应该使事实记录可以映射到 SCD2 的一条记录。
我有一个 table 包含以下数据。
我希望需要返回的行是 exp_dt“2020-09-22”。但是当下面的 运行 查询时,它返回两行。我不明白为什么它在具有 eff_dt“2020-09-19”时也返回第一行。
select id,cd,eff_dt,exp_dt,post_dt from table
where from_unixtime(unix_timestamp(eff_dt,"yyyy-MM-dd")) <= from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
and from_unixtime(unix_timestamp(exp_dt,"yyyy-MM-dd")) >= from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"));
我的查询有问题吗?我期待返回第二行。
使用 <
与 exp_date
进行比较:
select id,cd,eff_dt,exp_dt,post_dt
from table
where from_unixtime(unix_timestamp('2020-09-21', 'yyyy-MM-dd')) >= from_unixtime(unix_timestamp(eff_dt, 'yyyy-MM-dd')) and
from_unixtime(unix_timestamp('2020-09-22', 'yyyy-MM-dd')) < from_unixtime(unix_timestamp(exp_dt, 'yyyy-MM-dd'))
我把比较顺序颠倒了。我发现先用常量来遵循逻辑更容易。
这是否捕捉了同一天到期的边缘情况并同时解决了您的问题?
select id,cd,eff_dt,exp_dt,post_dt from table
where
(from_unixtime(unix_timestamp(eff_dt,"yyyy-MM-dd")) <= from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
and
from_unixtime(unix_timestamp(exp_dt,"yyyy-MM-dd")) > from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
)
or
(from_unixtime(unix_timestamp(eff_dt,"yyyy-MM-dd")) = from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
and
from_unixtime(unix_timestamp(exp_dt,"yyyy-MM-dd")) = from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
)
;
事实上我怀疑 exp 总是 >= eff,所以可能只有一个条件
from_unixtime(unix_timestamp(eff_dt,"yyyy-MM-dd")) <= from_unixtime(unix_timestamp("2020-09-21","yyyy-MM-dd"))
够了...?
您不需要 from_unixtime(unix_timestamp()),因为日期已经是正确的格式并且参数是相同的 yyyy-MM-dd 格式。
您查询中的问题是您对 eff 和 exp 日期都使用了 equal 要查找日期的最新记录,请使用此查询:
select id,cd,eff_dt,exp_dt,post_dt from table
where eff_dt <= "2020-09-21"
and exp_dt > "2020-09-21";
当SCD2中eff_dt = exp_dt时,如果你只有日期(没有时间成分),应该没有记录。只有当你使用时间戳时,日期才能相等,而时间不同,在这种情况下,在检查之前将你的参数日期转换为时间戳。
SCD2 的设计应该使事实记录可以映射到 SCD2 的一条记录。