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

如何基于client_id、code及日期顺序生成唯一newid

生成按状态码变更分组的唯一ID需求

原始数据集

以下是已按date1排序的数据集:

client_idcodedate1date2t
295710292000-01-01 00:00:00.0002000-03-01 00:00:00.00060
295710292000-03-01 00:00:00.0002000-07-01 00:00:00.000122
295710292000-07-01 00:00:00.0002001-01-01 00:00:00.000184
295710512001-01-01 00:00:00.0002001-03-01 00:00:00.00059
295710512001-03-01 00:00:00.0002001-12-01 00:00:00.000275
295710512001-12-01 00:00:00.0002002-06-03 00:00:00.000184
295710292002-06-03 00:00:00.0002003-03-01 00:00:00.000271
295710292003-03-01 00:00:00.0002004-02-01 00:00:00.000337
295710292004-02-01 00:00:00.0002004-08-01 00:00:00.000182
295710292004-08-01 00:00:00.0002004-12-01 00:00:00.000122

字段说明:

  • client_id:客户ID
  • code:状态码
  • date1:起始日期
  • date2:结束日期
  • t:两个日期的差值

期望结果

需要生成newid字段,规则为:同一客户连续使用相同code时newid相同;当客户变更code时分配新的newid;后续客户再次使用之前的code,仍需分配新的唯一newid。最终效果如下:

client_idcodedate1date2tnewid
295710292000-01-01 00:00:00.0002000-03-01 00:00:00.000601
295710292000-03-01 00:00:00.0002000-07-01 00:00:00.0001221
295710292000-07-01 00:00:00.0002001-01-01 00:00:00.0001841
295710512001-01-01 00:00:00.0002001-03-01 00:00:00.000592
295710512001-03-01 00:00:00.0002001-12-01 00:00:00.0002752
295710512001-12-01 00:00:00.0002002-06-03 00:00:00.0001842
295710292002-06-03 00:00:00.0002003-03-01 00:00:00.0002713
295710292003-03-01 00:00:00.0002004-02-01 00:00:00.0003373
295710292004-02-01 00:00:00.0002004-08-01 00:00:00.0001823
295710292004-08-01 00:00:00.0002004-12-01 00:00:00.0001223

实现方法

可以使用SQL窗口函数实现,核心思路是通过对比当前行与前一行的code值,标记状态变更点,再累加标记值得到分组ID。

SQL代码示例

SELECT 
    client_id,
    code,
    date1,
    date2,
    t,
    SUM(flag) OVER (PARTITION BY client_id ORDER BY date1) AS newid
FROM (
    SELECT 
        client_id,
        code,
        date1,
        date2,
        t,
        CASE 
            WHEN LAG(code) OVER (PARTITION BY client_id ORDER BY date1) = code THEN 0
            ELSE 1
        END AS flag
    FROM your_table_name
) AS subquery;

代码说明

  1. 内层子查询:用LAG(code)获取当前客户上一行的code值,若与当前行code不同则标记为1,否则标记为0;
  2. 外层查询:按客户分组、日期排序,对标记值进行累加,累加结果就是连续相同code分组的唯一newid。

该方法适用于支持窗口函数的SQL数据库(如MySQL 8.0+、PostgreSQL、SQL Server等)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:45:17