sql - 仅根据 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_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 上创建一个数字表,以便可以更好地优化整体查询计划,尤其是在执行交叉连接时。
推荐阅读
- apache-kafka - 如何确定 Kafka Streams 的正确参数
- riscv - 在 RISC-V 上读取 mtvec 寄存器
- python - 如何避免make命令触发Xcode
- apache-flink - 如何使用 flink 1.11 在 kubernetes 上扩展/缩减正在运行的 Flink 集群?
- c++ - 如何在 C++ Visual Studio 2019 中的表单上制作复制按钮
- c# - 没有 Console.ReadLine() 或 Console.ReadKey() 无法运行异步方法
- laravel - 阻塞:当可选路由参数为空时,Laravel 发布请求上的混合内容
- spring-webflux - Mono 或 Flux of Map 删除重复项
- node.js - 从节点后端到节点/快递服务器的 HTTP POST 请求失败
- config - 在没有预训练的情况下找到 Alexey yolov4 权重?