仅根据RedShift中的开始日期生成具有递增日期的行 [英] Generate rows with incrementing dates based on just a starting date in Redshift

查看:35
本文介绍了仅根据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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆