问题描述
我想通过查询使用两个日期字段作为 redshift 中的基础来创建时间序列。例如,假设我有一个如下表:
ID | 舞台 | 输入于 | 退出时间 |
---|---|---|---|
8881 | 第一阶段 | 2021-01-28 | 2021-02-01 |
8881 | 第二阶段 | 2021-02-01 | 2021-02-04 |
8881 | 第三阶段 | 2021-02-04 | 2021-02-08 |
8882 | 第一阶段 | 2021-01-30 | 2021-02-04 |
8882 | 第二阶段 | 2021-02-04 | 2021-02-06 |
使用 entered on
和 exited on
字段,我想为每个 ID/阶段创建每日快照。所需的输出如下所示:
日期 | ID | 舞台 | 输入于 | 退出时间 |
---|---|---|---|---|
2021-01-28 | 8881 | 第一阶段 | 2021-01-28 | 2021-02-01 |
2021-01-29 | 8881 | 第一阶段 | 2021-01-28 | 2021-02-01 |
2021-01-30 | 8881 | 第一阶段 | 2021-01-28 | 2021-02-01 |
2021-01-31 | 8881 | 第一阶段 | 2021-01-28 | 2021-02-01 |
2021-02-01 | 8881 | 第一阶段 | 2021-01-28 | 2021-02-01 |
2021-02-01 | 8881 | 第二阶段 | 2021-02-01 | 2021-02-04 |
2021-02-02 | 8881 | 第二阶段 | 2021-02-01 | 2021-02-04 |
2021-02-03 | 8881 | 第二阶段 | 2021-02-01 | 2021-02-04 |
2021-02-04 | 8881 | 第三阶段 | 2021-02-04 | 2021-02-08 |
...... | ...... | ...... | ...... | ...... |
2021-01-30 | 8882 | 第一阶段 | 2021-01-30 | 2021-02-04 |
2021-01-31 | 8882 | 第一阶段 | 2021-01-30 | 2021-02-04 |
2021-02-01 | 8882 | 第一阶段 | 2021-01-30 | 2021-02-04 |
2021-02-02 | 8882 | 第一阶段 | 2021-01-30 | 2021-02-04 |
2021-02-03 | 8882 | 第一阶段 | 2021-01-30 | 2021-02-04 |
2021-02-04 | 8882 | 第一阶段 | 2021-01-30 | 2021-02-04 |
2021-02-04 | 8882 | 第二阶段 | 2021-02-04 | 2021-02-08 |
2021-02-05 | 8882 | 第二阶段 | 2021-02-04 | 2021-02-08 |
...... | ...... | ...... | ...... | ...... |
我知道我可以使用 CTE 在内存中生成时间序列,但无法找出将其关联到创建两个日期的历史时间序列的最佳方法。我假设这里有一个连接,我可以根据进入或退出的日期大于或等于时间序列的日期来做,但到目前为止还没有运气。当我尝试这样做时,出现以下错误:
[0A000] 错误:Redshift 表不支持指定的类型或函数(每个 INFO 消息一个)。
这里的任何帮助将不胜感激,并提前感谢您!
(select (getdate()::date - generate_series)::date
from generate_series(1,2000,1)) ```
解决方法
我想通了,我的逻辑是正确的 - 它与生成系列部分以及 redshift 如何处理该功能有关。我应该更早地研究这个。如果我使用这样的东西并放入 CTE:
( SELECT DATEADD('day',-n,(CURRENT_DATE+1)) AS generated_date
FROM (SELECT ROW_NUMBER() OVER () AS n FROM my_table) n
ORDER BY generated_date DESC)
然后使用以下条件将其与我的第一个表结合起来:
on t.generated_date>=entered_on and t.generated_date<=exited_on
它产生所需的输出。