我有一个包含3列的表-开始,结束和emp_num。我想生成一个新表,其中包含每个雇员在这些日期之间的所有日期。需要使用Presto。
我引用了此链接-inserting dates into a table between a start and end date in Presto
尝试通过创建序列使用unnest函数,但是,我不知道如何通过从另一张表的两列中提取日期来创建序列。
select unnest(seq) as t(days)
from (select sequence(start, end, interval '1' day) as seq
from table1)
这是表格和预期格式
Table 1:
start | end | emp_num
2018/01/01 | 2018/01/05 | 1
2019/02/01 | 2019/02/05 | 2
Expected:
start | emp_num
2018/01/01 | 1
2018/01/02 | 1
2018/01/03 | 1
2018/01/04 | 1
2018/01/05 | 1
2019/02/01 | 2
2019/01/02 | 2
2019/02/03 | 2
2019/02/04 | 2
2019/02/05 | 2
答案 0 :(得分:1)
这是一个查询,可能会为您的用例完成工作。
逻辑是使用Presto sequence()
function生成较宽的日期范围(从2000年到2018年底,您可以根据需要进行调整),可以将其与表格结合以生成输出。
select dt.x, emp_num
from
( select x from unnest(sequence(date '2000-01-01', date '2018-01-31')) t(x) ) dt
inner join table1 ta on dt.x >= ta.start and dt.x <= ta.end
但是,正如JNevill所评论的那样,创建日历表要比每次查询运行时都动态生成日历表更为有效。
应该很简单:
create table calendar as
select x from unnest(sequence(date '1970-01-01', date '2099-01-01')) t(x);
然后您的查询将变为:
select dt.x, emp_num
from
calendar dt
inner join table1 ta on dt.x >= ta.start and dt.x <= ta.end
PS:由于野外缺少Presto的DB Fiddles,我无法测试查询(@PiotrFindeisen-如果您碰巧读到此,Presto Fiddle会很高兴!)。