SQL按后续记录分组:统计下一个type值并分配至同组的实现方法
解决方案
要实现给每个组匹配按日期顺序的下一个组的type值并分配到组内所有行的需求,核心是用窗口函数LEAD()——它能直接获取排序后下一行的数据,正好对应你要的“下一个(following)”逻辑。具体实现步骤如下:
- 按组聚合基础信息:因为同一个
group内的type完全一致,先提取每个组的最早日期(用来确定组的时间顺序)和对应type。 - 用
LEAD()获取下一个组的type:对聚合后的结果按日期排序,通过LEAD(type)拿到下一个组的type值。 - 关联回原表:把得到的下一个type值关联到原表的每一行,完成“分配至同一组”的效果。
示例SQL脚本
-- 先通过CTE获取每个组的基础信息及下一个组的type WITH group_info AS ( SELECT `group`, type, MIN(date) AS group_min_date, -- 按组的最早日期排序,获取下一个组的type,无后续组则返回NULL LEAD(type) OVER (ORDER BY MIN(date)) AS next_type FROM your_table_name GROUP BY `group`, type ) -- 关联回原表,给每一行添加上所属组的下一个type SELECT t.date, t.type, t.`group`, gi.next_type FROM your_table_name t JOIN group_info gi ON t.`group` = gi.`group` ORDER BY t.date;
执行结果
基于你提供的表数据,执行后会得到:
| date | type | group | next_type |
|---|---|---|---|
| jan1 | a | 1 | b |
| jan2 | a | 1 | b |
| jan3 | b | 2 | c |
| jan4 | c | 3 | a |
| jan5 | a | 4 | b |
| jan6 | b | 5 | NULL |
| jan7 | b | 5 | NULL |
补充说明
- 若最后一个组没有后续组,
next_type会显示NULL,你可以用COALESCE(next_type, '默认值')替换成需要的内容。 - 如果你使用的是不支持CTE(
WITH子句)的数据库(如MySQL 5.x),可以把group_info改成子查询形式:
SELECT t.date, t.type, t.`group`, gi.next_type FROM your_table_name t JOIN ( SELECT `group`, type, MIN(date) AS group_min_date, LEAD(type) OVER (ORDER BY MIN(date)) AS next_type FROM your_table_name GROUP BY `group`, type ) gi ON t.`group` = gi.`group` ORDER BY t.date;
内容的提问来源于stack exchange,提问作者jlolol
相关产品推荐
相关产品推荐

