如何创建随其他列值变化递增的列?含分组重置需求
问题1:统计单列值变化次数
现有视图数据:
col1 aaa aaa ccc ddd
需新增一列value_change_counter,统计col1值的变化次数,预期结果:
col1 value_change_counter aaa 1 aaa 1 ccc 2 ddd 3
解法
利用窗口函数LAG()获取前一行的col1值,对比当前行判断是否发生变化,再通过SUM()累加变化标识得到计数器:
SELECT col1, SUM(CASE WHEN prev_col1 IS NULL OR prev_col1 != col1 THEN 1 ELSE 0 END) OVER (ORDER BY 排序字段) AS value_change_counter FROM ( SELECT col1, LAG(col1) OVER (ORDER BY 排序字段) AS prev_col1 FROM your_view ) t;
注意:将
排序字段替换为视图中实际的排序依据(如主键、时间列),确保数据顺序稳定,避免结果异常。如果没有明确排序字段,部分数据库可用ORDER BY (SELECT NULL)(但不保证顺序一致性)。
问题2:分组内统计值变化(组切换时重置计数器)
需求:col1值变化时计数,col2值变化时重置计数器,示例输入:
col1 col2 aaa ttt aaa ttt bbb ttt ccc yyy ddd uuu eee uuu fff uuu
预期输出:
col1 col2 value_change_counter aaa ttt 1 aaa ttt 1 bbb ttt 2 ccc yyy 1 ddd uuu 1 eee uuu 2 fff uuu 3
解法
在问题1的基础上,通过PARTITION BY col2将数据按col2分组,分组内独立统计col1的变化次数:
SELECT col1, col2, SUM(CASE WHEN prev_col1 IS NULL OR prev_col1 != col1 THEN 1 ELSE 0 END) OVER (PARTITION BY col2 ORDER BY 排序字段) AS value_change_counter FROM ( SELECT col1, col2, LAG(col1) OVER (PARTITION BY col2 ORDER BY 排序字段) AS prev_col1 FROM your_view ) t;
同样需替换
排序字段为实际排序依据,保证分组内的数据顺序符合业务预期。
内容的提问来源于stack exchange,提问作者Dinu Nicolae
相关产品推荐
相关产品推荐

