SQL generate_series并用于联接

SQL generate_series and use it for join

提问人:Kiara 提问时间:8/10/2023 最后编辑:Kiara 更新时间:8/11/2023 访问量:46

问:

我正在尝试在 Redshift 上生成一个日期列表,以将其与另一个包含事件开始和结束日期的表联接,以便我可以拥有每个日期的事件 ID 列表。

此查询生成日期列表:

select date '2023-03-01' + i AS dt
from  generate_series(0, ((current_date - 5) - date '2023-03-01')) i)
DT
2023-03-01
2023-03-02
2023-03-03
...

这将查看事件表:

select e_id, start_date, end_date
from  tableA
e_id start_date end_date
1 2023-03-01 2023-03-04
2 2023-03-03 2023-03-05
3 2023-03-02 2023-03-03

我尝试了这个查询:

with dl as (
select date '2023-03-01' + i AS dt
from  generate_series(0, ((current_date - 5) - date '2023-03-01')) i)
)
, e as (
select e_id, start_date, end_date
from  tableA
)
select dt, e_id
from dl
left join e on dl.dt >= e.start_date and dl.dt <= e.end_date

但是我收到以下错误:

NOTICE: Function "generate_series(integer,integer)" not supported.
Specified types or functions (one per INFO message) not supported on Redshift tables.

鉴于上面的例子,我预计会得到以下结果:

DT e_id
2023-03-01 1
2023-03-02 1
2023-03-02 3
2023-03-03 1
2023-03-03 2
2023-03-03 3
2023-03-04 1
2023-03-04 2
2023-03-05 2
SQL 日期 联接 Amazon-Redshift 序列

评论


答:

1赞 Bill Weiner 8/10/2023 #1

不支持将 generate_series() 作为生成用于表数据的数据的方法。对于原因(硬件架构)和使用递归 CTE 生成相同的结果,有很多答案。一个这样的递归 CTE 从上一个答案生成日期:

尝试在 Redshift 中创建日期表

==========================================================

再次来自之前的答案(但更古老):您可以使用二次幂方法和交叉连接生成任意数字序列。看:

Redshift:生成连续的数字范围

创建必要数字序列后,您可以使用它来将天数添加到开始日期,直到必要的结束日期。

评论

0赞 Kiara 8/11/2023
谢谢@bill-weiner!这适用于获得所需的输出。但是,不幸的是,我不能使用递归 CTE,因为我必须将查询输入到不支持 Redshift 连接的递归 CTE 的第三方服务器中。如果没有递归 CTE,真的无法在 Redshift 中生成日期列表吗?
0赞 Bill Weiner 8/11/2023
递归 CTE 在 Redshift 中是相当新的,所以是的,有更旧的方法可以做到这一点。我假设您需要一个可以在两个数据库中都有效的查询,所以我将选择一个应该执行此操作的查询。我将使用应该满足需要的二进制数学方法来更新我的答案。