我有一个要求,我需要返回到一列的以前的值,直到1000行,并为下一步获取以前的1000个日期,但是表中该列不存在所有这些1000个以前的日期。但是我需要那些缺少的日期才能从查询的输出中获取。 当我尝试在查询下运行时,它不显示当前日期中的1000个以前的日期
示例中,日期列仅提供2个日期
date
2019-01-16
2019-01-19
我想出一个查询来获取1000个日期,但是由于缺少所有以前的日期,它只给出最近的日期
SELECT date FROM table1 t
WHERE
date >= date_sub(current_date,1000) and dt<current_date ORDER BY date LIMIT 1
如果我在上面的查询中运行,它将显示2019-01-16
,因为不存在前1000天的追溯日期,所以它给出的是最近的日期2019-01-16
,但是我需要从{{1}开始的日期丢失}(从当前日期算起的第1000个日期)到当前日期(2016-04-23
)之前作为我的查询的输出。您能帮上忙吗?
答案 0 :(得分:1)
您可以在子查询中生成所需范围的日期(请参见下面的示例中的date_range
子查询),并在表中left join
生成日期。如果表中的某些日期没有记录,则该值将为null,将从date_range
子查询返回的日期之间没有任何间隔。为所需的date_range设置start_date
和end_date
参数:
set hivevar:start_date=2016-04-23; --replace with your start_date
set hivevar:end_date=current_date; --replace with your end_date
set hive.exec.parallel=true;
set hive.auto.convert.join=true; --this enables map-join
set hive.mapjoin.smalltable.filesize=25000000; --size of table to fit in memory
with date_range as
(--this query generates date range, check it's output
select date_add ('${hivevar:start_date}',s.i) as dt
from ( select posexplode(split(space(datediff(${hivevar:end_date},'${hivevar:start_date}')),' ')) as (i,x) ) s
)
select d.dt as date,
t.your_col --some value from your table on date
from date_range d
left join table1 t on d.dt=t.date
order by d.dt --order by dates if necessary