如何筛选拥有连续4个季度记录的目标数据?
筛选拥有连续4个季度记录的用户(Name)解决方案
需求说明
需要从数据集中筛选出拥有连续4个季度完整记录的Name,包含两种有效场景:
- 同一年份内的4个季度全部存在(如Name2在2012年的4个季度均有记录)
- 跨年份的连续4个季度(如Name5的2012年Q3-Q4 + 2013年Q1-Q2,构成连续4个季度)
此前尝试用ROW_NUMBER()分区处理,但跨年份场景下无法生效,需可行的实现方案。
原始数据集
| Name | Year | Season |
|---|---|---|
| Name1 | 2011 | 1 |
| Name1 | 2011 | 2 |
| Name2 | 2012 | 1 |
| Name2 | 2012 | 2 |
| Name2 | 2012 | 3 |
| Name2 | 2012 | 4 |
| Name3 | 2012 | 3 |
| Name3 | 2012 | 4 |
| Name4 | 2012 | 1 |
| Name4 | 2012 | 4 |
| Name5 | 2012 | 3 |
| Name5 | 2012 | 4 |
| Name5 | 2013 | 1 |
| Name5 | 2013 | 2 |
反例说明
若Name3仅有如下记录,则不符合要求(仅2个连续季度,未达到4个):
| Name | Year | Season |
|---|---|---|
| ... | ||
| Name3 | 2014 | 1 |
| Name3 | 2014 | 2 |
| ... |
解决方案(SQL实现)
核心思路是把每个季度转换成连续的整数序号,让跨年份的季度也能被识别为连续序列,再通过窗口函数标记连续区间,最后筛选出存在长度≥4的连续区间的Name。
完整SQL代码
WITH quarterly_data AS ( SELECT Name, Year, Season, -- 生成连续季度序号:将年份和季度转为唯一连续整数 Year * 4 + Season AS seq FROM your_table_name ), continuous_groups AS ( SELECT Name, seq, -- 生成连续分组标识:同一连续区间的记录会得到相同的group_id seq - ROW_NUMBER() OVER (PARTITION BY Name ORDER BY seq) AS group_id FROM quarterly_data ), group_length AS ( SELECT Name, COUNT(*) AS consecutive_count FROM continuous_groups GROUP BY Name, group_id ) -- 筛选存在连续4个及以上季度的Name SELECT DISTINCT Name FROM group_length WHERE consecutive_count >= 4;
代码逻辑说明
quarterly_data:将每个季度转换为连续整数(如2012Q4=20124+4=8052,2013Q1=20134+1=8053),解决跨年份连续性判断问题。continuous_groups:通过seq - ROW_NUMBER()生成分组标识,同一连续区间的记录会得到相同的group_id。group_length:统计每个连续区间的季度数量。- 最终筛选:提取存在长度≥4的连续区间的Name,去重后得到结果。
测试后会返回符合要求的Name2和Name5,其余Name会被排除,完全匹配需求。
内容的提问来源于stack exchange,提问作者DooDoo
相关产品推荐
相关产品推荐

