You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选拥有连续4个季度记录的目标数据?

筛选拥有连续4个季度记录的用户(Name)解决方案

需求说明

需要从数据集中筛选出拥有连续4个季度完整记录的Name,包含两种有效场景:

  1. 同一年份内的4个季度全部存在(如Name2在2012年的4个季度均有记录)
  2. 跨年份的连续4个季度(如Name5的2012年Q3-Q4 + 2013年Q1-Q2,构成连续4个季度)
    此前尝试用ROW_NUMBER()分区处理,但跨年份场景下无法生效,需可行的实现方案。

原始数据集

NameYearSeason
Name120111
Name120112
Name220121
Name220122
Name220123
Name220124
Name320123
Name320124
Name420121
Name420124
Name520123
Name520124
Name520131
Name520132

反例说明

若Name3仅有如下记录,则不符合要求(仅2个连续季度,未达到4个):

NameYearSeason
...
Name320141
Name320142
...

解决方案(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;

代码逻辑说明

  1. quarterly_data:将每个季度转换为连续整数(如2012Q4=20124+4=8052,2013Q1=20134+1=8053),解决跨年份连续性判断问题。
  2. continuous_groups:通过seq - ROW_NUMBER()生成分组标识,同一连续区间的记录会得到相同的group_id。
  3. group_length:统计每个连续区间的季度数量。
  4. 最终筛选:提取存在长度≥4的连续区间的Name,去重后得到结果。

测试后会返回符合要求的Name2和Name5,其余Name会被排除,完全匹配需求。

内容的提问来源于stack exchange,提问作者DooDoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 06:23:26