生成两个日期字段的时间序列redshift,sql

问题描述

我想通过查询使用两个日期字段作为 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 onexited 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

它产生所需的输出。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...