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

SQL Server基于特定值、客户/类别变化分组标记GroupID的需求

解决方案(SQL Server)

针对你的分组需求,我们可以通过窗口函数标记分组起始点 + 累计求和生成GroupID的方式实现,完全覆盖你提到的「无Initial但客户/类别变化」的场景。

核心思路

  1. 先按CustomerID、CategoryID、Date对数据排序,这是分组的基础顺序。
  2. 给每行标记是否为新分组的起点:
    • 第一条记录默认是新分组起点
    • 当Description = 'Initial'时,标记为新分组起点
    • 当当前行的CustomerID或CategoryID与上一行不同时,标记为新分组起点
  3. 对起点标记做累计求和,得到唯一的GroupID。

实现代码

假设你的数据表名为CustomerRecords,字段为CustomerID、CategoryID、Date、Description,代码如下:

WITH GroupStarts AS (
    SELECT 
        *,
        -- 标记是否为新分组起点:1=是,0=否
        CASE
            -- 第一条记录直接标记为起点
            WHEN LAG(CustomerID) OVER (ORDER BY CustomerID, CategoryID, Date) IS NULL THEN 1
            -- Description为Initial时标记
            WHEN Description = 'Initial' THEN 1
            -- CustomerID或CategoryID变化时标记
            WHEN CustomerID != LAG(CustomerID) OVER (ORDER BY CustomerID, CategoryID, Date) 
                 OR CategoryID != LAG(CategoryID) OVER (ORDER BY CustomerID, CategoryID, Date) THEN 1
            ELSE 0
        END AS IsGroupStart
    FROM CustomerRecords
)
SELECT 
    CustomerID,
    CategoryID,
    Date,
    Description,
    -- 累计求和生成GroupID
    SUM(IsGroupStart) OVER (ORDER BY CustomerID, CategoryID, Date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS GroupID
FROM GroupStarts
ORDER BY CustomerID, CategoryID, Date;

关键细节说明

  • LAG()函数:用于获取上一行的CustomerID和CategoryID,对比判断是否发生变化。
  • SUM() OVER(...)的累计求和:从第一条记录到当前行的所有IsGroupStart值相加,每遇到一个起点(值为1),GroupID就会递增,自然形成连续的分组编号。
  • 覆盖边缘场景:即使某客户/类别下的第一条记录是Follow up,因为LAG()返回NULL,会被标记为起点,生成新的GroupID,解决了你之前方案的遗漏问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:48:46