仅根据RedShift中的开始日期生成具有递增日期的行 [英] Generate rows with incrementing dates based on just a starting date in Redshift
本文介绍了仅根据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
推荐答案
在RedShift上,正如您已经看到的那样,不支持将GENERATE_SELECTION作为一种使数据用于表数据的方法。简单的替代方法是递归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上创建Numbers表,以便可以更好地优化整体查询计划,尤其是在执行交叉联接时。
这篇关于仅根据RedShift中的开始日期生成具有递增日期的行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文