如何基于TFvalue列值为面板数据按ID生成序列分组编号
实现方案
你需要的是按ID分组后,统计当前行之前出现过的TFvalue=1的次数,累加后加1就是目标分组编号,用累计求和窗口函数即可实现,标准SQL写法如下:
SELECT ID, TFvalue, Date, -- 统计当前行之前同ID下TFvalue=1的数量,加1得到分组号 COALESCE( SUM(CASE WHEN TFvalue = 1 THEN 1 ELSE 0 END) OVER ( PARTITION BY ID ORDER BY Date ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ), 0 ) + 1 AS GroupNum FROM 你的表名 ORDER BY ID, Date;
逻辑说明
PARTITION BY ID保证分组逻辑只在同一个ID内部生效ORDER BY Date保证按时间顺序统计- 窗口函数的求和范围
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING指定只统计当前行之前的所有行,不包含当前行 COALESCE处理每个ID第一行没有前置行的场景,空值补0- 统计到的前置1的数量加1,就得到从1开始递增的分组编号
为什么DENSE_RANK不适用
DENSE_RANK是基于字段值的排序结果分组,而你的需求是事件驱动的序列分组(每出现一次TFvalue=1就触发分组编号+1),不属于按值排序的分组场景,所以无法直接用排名函数实现。
内容的提问来源于stack exchange,提问作者jackDanielle
相关产品推荐
相关产品推荐

