在两个日期之间添加行Presto

时间:2019-01-21 20:28:04

标签: sql presto

我有一个包含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

1 个答案:

答案 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会很高兴!)。