如何在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
逻辑说明
- 对比上一条渠道:使用
LAG(CHANNEL) OVER (PARTITION BY CLIENT_ID ORDER BY START_DT)获取当前客户按START_DT升序排列的上一条记录的服务渠道。 - 标记渠道变更:通过CASE语句判断当前渠道与上一条是否相同,相同则返回0(无变更),不同则返回1(有变更)。
- 累加生成KEY:用
SUM() OVER (PARTITION BY CLIENT_ID ORDER BY START_DT)对变更标记值进行累加,每次渠道变化时累加1,连续相同渠道的记录会获得同一个KEY值。
最终结果
| CLIENT_ID | START_DT | END_DT | CHANNEL | KEY |
|---|---|---|---|---|
| 100 | 2016/11/17 | 2016/12/31 | Mass | 1 |
| 100 | 2016/10/10 | 2016/11/16 | Mass | 1 |
| 101 | 2016/11/13 | 2016/12/31 | Mass | 3 |
| 101 | 2016/11/12 | 2016/11/12 | Prem | 2 |
| 101 | 2016/11/08 | 2016/11/11 | Mass | 1 |
| 101 | 2016/10/13 | 2016/11/07 | Mass | 1 |
内容的提问来源于stack exchange,提问作者percival
相关产品推荐
相关产品推荐

