首页 > 解决方案 > 仅根据 Redshift 中的开始日期生成日期递增的行

问题描述

我正在处理一个用户订阅信息表,其中每一行都是一个特定的用户,以及他们订阅的开始日期以及他们预付了多少个月。我试图打破这张表,以便每个月有一行。我在 Redshift 上,我发现的唯一其他答案表明generate_series这并不总是适用于 Redshift。

起始数据:

userid  |  amount_paid  |  start_date  |  months
------------------------------------------------
asdf    |  20.00        | 2020-01-01   |  1
------------------------------------------------
qwer    |  10.00        | 2021-06-01   |  3

期望的结果(months列值无关紧要,但我希望amount_paid新行为 0 或 null):

userid  |  amount_paid  |  start_date  |  months
------------------------------------------------
asdf    |  20.00        | 2020-01-01   |  1
------------------------------------------------
qwer    |  10.00        | 2021-06-01   |  3
------------------------------------------------
qwer    |  0            | 2021-07-01   |  3
------------------------------------------------
qwer    |  0            | 2021-08-01   |  3

标签: sqlamazon-web-servicesdateamazon-redshift

解决方案


如您所见,在 redshift 上,不支持将 generate_series 作为生成数据以用于表数据的方法。一个简单的替换是递归 CTE 来生成您正在寻找的数字。

with recursive numbers(n) as
( select 1 as n
    union all
    select n + 1
    from numbers n
    where n.n <= 500
    )
select n from numbers;

以上产生了 1 到 500 之间的数字。

如果您的表很大并且结果查询的性能很重要,您可能需要考虑这组数据的分布,因为它会影响查询计划。您可以使用 DISTSTYLE ALL 在 Redshift 上创建一个数字表,以便可以更好地优化整体查询计划,尤其是在执行交叉连接时。


推荐阅读