sql - 如何根据条件对 sql 上的行进行分组
问题描述
我正在使用 redshift sql 并希望将具有重叠凭证期的用户分组到一行中(显示最短开始日期和最长结束日期)
例如,如果我有这些记录,
我想使用红移来实现这个结果
解释是 tat 因为第 1 行和第 2 行有重叠的日期,我想将它们组合在一起并得到 min(Start_date) 和 max(End_Date)
我真的不知道从哪里开始。尝试使用 row_number 对它们进行分区,但似乎效果不佳。这是我尝试过的。
select
id,
start_date,
end_date,
lag(end_date, 1) over (partition by id order by start_date) as prev_end_date,
row_number() over (partition by id, (case when prev_end_date >= start_date then 1 else 0) order by start_date) as rn
from users
有什么建议吗?谢谢好心的先生们。
解决方案
这是一种差距和孤岛问题。因为日期是任意的,所以让我建议以下方法:
- 使用累积最大值来获取当前日期之前的最大 end_date。
- 使用逻辑来确定何时没有总体(即新时期开始)。
- 开始的累积总和提供了组的标识符。
- 然后聚合。
作为 SQL:
select id, min(start_date), max(end_date)
from (select u.*,
sum(case when prev_end_date >= start_date then 0 else 1
end) over (partition by id
order by start_date, voucher_code
rows between unbounded preceding and current row
) as grp
from (select u.*,
max(end_date) over (partition by id
order by start_date, voucher_code
rows between unbounded preceding and 1 preceding
) as prev_end_date
from users u
) u
) u
group by id, grp;
推荐阅读
- php - PHP中基于键组合数组
- javascript - JavaScript 使数组参数不可变
- docusignapi - 为什么 Docusign api 检索已删除的信封?
- flutter - 将 2 个变量从 2 个不同的屏幕传递到 1 个屏幕
- apache-spark - 查询“select * from tab1”时在 hive 中找不到表
- r - 子文档中的块选项默认值
- mysql - 导入时未选择数据库
- android-studio - Android Studio 4.0 文件 > 新建 > 活动或片段不起作用
- excel - 根据另一行的最大值有条件地格式化单元格
- r - R:如何去掉字符串中的问号块?