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

如何创建随其他列值变化递增的列?含分组重置需求

问题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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:05:31