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

如何为连续相同价格的行生成独立GroupID

问题描述

我有如下数据表:

ProductIDPriceID
902715691
902714552
902716693
902715354
902715355
902715356
902714197
902713008
902714199
9027141910
9027153511

需要添加一个GroupID列,将连续相同价格的行归为同一个GroupID,价格变化时生成新的GroupID。直接用DENSE_RANK()不行,因为它会把ID4、5、6、11的行分配相同的GroupID,不符合需求。期望结果如下:

ProductIDPriceIDGroupID
9027156911
9027145522
9027166933
9027153544
9027153554
9027153564
9027141975
9027130086
9027141997
90271419107
90271535118
解决方案

可以通过**窗口函数LAG()**结合累加标识的方式实现,核心思路是:

  1. 用LAG(Price)获取当前行的上一行Price值
  2. 比较当前行Price和上一行是否相同,生成变化标识(不同则为1,相同则为0)
  3. 对变化标识做累加求和,得到连续相同Price的分组ID

SQL 代码示例

SELECT 
    ProductID,
    Price,
    ID,
    SUM(change_flag) OVER (ORDER BY ID) AS GroupID
FROM (
    SELECT 
        ProductID,
        Price,
        ID,
        -- 第一行无前置行,默认标记为1;后续行价格变化时标记为1,否则0
        CASE 
            WHEN LAG(Price) OVER (ORDER BY ID) != Price OR LAG(Price) OVER (ORDER BY ID) IS NULL 
            THEN 1 
            ELSE 0 
        END AS change_flag
    FROM your_table_name
) t;

代码解释

  • 内层子查询:通过LAG(Price) OVER (ORDER BY ID)获取当前行的上一行价格,判断是否与当前行价格不同,生成change_flag。第一行因无前置行,LAG返回NULL,直接标记为1。
  • 外层查询:对change_flag按ID顺序累加求和,每次遇到价格变化时累加值+1,从而生成连续相同价格的分组ID。

如果数据需要按ProductID分组(比如存在多个ProductID时),只需在窗口函数中添加PARTITION BY ProductID:

SELECT 
    ProductID,
    Price,
    ID,
    SUM(change_flag) OVER (PARTITION BY ProductID ORDER BY ID) AS GroupID
FROM (
    SELECT 
        ProductID,
        Price,
        ID,
        CASE 
            WHEN LAG(Price) OVER (PARTITION BY ProductID ORDER BY ID) != Price OR LAG(Price) OVER (PARTITION BY ProductID ORDER BY ID) IS NULL 
            THEN 1 
            ELSE 0 
        END AS change_flag
    FROM your_table_name
) t;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:09:56