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

SQL按后续记录分组:统计下一个type值并分配至同组的实现方法

解决方案

要实现给每个组匹配按日期顺序的下一个组的type值并分配到组内所有行的需求,核心是用窗口函数LEAD()——它能直接获取排序后下一行的数据,正好对应你要的“下一个(following)”逻辑。具体实现步骤如下:

  1. 按组聚合基础信息:因为同一个group内的type完全一致,先提取每个组的最早日期(用来确定组的时间顺序)和对应type。
  2. 用LEAD()获取下一个组的type:对聚合后的结果按日期排序,通过LEAD(type)拿到下一个组的type值。
  3. 关联回原表:把得到的下一个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;

执行结果

基于你提供的表数据,执行后会得到:

datetypegroupnext_type
jan1a1b
jan2a1b
jan3b2c
jan4c3a
jan5a4b
jan6b5NULL
jan7b5NULL

补充说明

  • 若最后一个组没有后续组,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:00:14