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

如何在MySQL中实现随服务渠道变化的客户分组递增计数器

问题需求

现有表Table1存储银行客户各类信息(包含服务渠道字段CHANNEL),数据按时间区间START_DT-END_DT划分。需要从该表查询所有数据,并新增计算列KEY——针对每个客户,每当其服务渠道发生变更时,该列值递增;同一连续渠道区间内的记录,KEY值保持一致。

基础查询框架如下:

SELECT
  CLIENT_ID, START_DT, END_DT, CHANNEL, «???» AS 'KEY'
FROM
  Table1
WHERE 
  CLIENT_ID IN(100, 101)
ORDER BY
  CLIENT_ID, START_DT DESC
解决方案

可以通过窗口函数实现该需求,核心是识别连续相同的渠道分组,并为每个分组分配递增的KEY值:

SELECT
  CLIENT_ID, 
  START_DT, 
  END_DT, 
  CHANNEL,
  SUM(CASE WHEN CHANNEL = LAG(CHANNEL) OVER (PARTITION BY CLIENT_ID ORDER BY START_DT) THEN 0 ELSE 1 END) OVER (PARTITION BY CLIENT_ID ORDER BY START_DT) AS `KEY`
FROM
  Table1
WHERE 
  CLIENT_ID IN(100, 101)
ORDER BY
  CLIENT_ID, START_DT DESC

逻辑说明

  1. 对比上一条渠道:使用LAG(CHANNEL) OVER (PARTITION BY CLIENT_ID ORDER BY START_DT)获取当前客户按START_DT升序排列的上一条记录的服务渠道。
  2. 标记渠道变更:通过CASE语句判断当前渠道与上一条是否相同,相同则返回0(无变更),不同则返回1(有变更)。
  3. 累加生成KEY:用SUM() OVER (PARTITION BY CLIENT_ID ORDER BY START_DT)对变更标记值进行累加,每次渠道变化时累加1,连续相同渠道的记录会获得同一个KEY值。
最终结果
CLIENT_IDSTART_DTEND_DTCHANNELKEY
1002016/11/172016/12/31Mass1
1002016/10/102016/11/16Mass1
1012016/11/132016/12/31Mass3
1012016/11/122016/11/12Prem2
1012016/11/082016/11/11Mass1
1012016/10/132016/11/07Mass1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:57:12