提问人:Kiara 提问时间:8/10/2023 最后编辑:Kiara 更新时间:8/11/2023 访问量:46
SQL generate_series并用于联接
SQL generate_series and use it for join
问:
我正在尝试在 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 |
答:
1赞
Bill Weiner
8/10/2023
#1
不支持将 generate_series() 作为生成用于表数据的数据的方法。对于原因(硬件架构)和使用递归 CTE 生成相同的结果,有很多答案。一个这样的递归 CTE 从上一个答案生成日期:
==========================================================
再次来自之前的答案(但更古老):您可以使用二次幂方法和交叉连接生成任意数字序列。看:
创建必要数字序列后,您可以使用它来将天数添加到开始日期,直到必要的结束日期。
评论
0赞
Kiara
8/11/2023
谢谢@bill-weiner!这适用于获得所需的输出。但是,不幸的是,我不能使用递归 CTE,因为我必须将查询输入到不支持 Redshift 连接的递归 CTE 的第三方服务器中。如果没有递归 CTE,真的无法在 Redshift 中生成日期列表吗?
0赞
Bill Weiner
8/11/2023
递归 CTE 在 Redshift 中是相当新的,所以是的,有更旧的方法可以做到这一点。我假设您需要一个可以在两个数据库中都有效的查询,所以我将选择一个应该执行此操作的查询。我将使用应该满足需要的二进制数学方法来更新我的答案。
评论