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

如何按连续相同的type字段分组汇总SQL数据?

实现连续同类型记录的分组求和

要实现连续相同type的记录归组求和,核心思路是先为连续同类型的记录生成唯一的分组标识,再基于分组对quantity求和。以下是具体实现方案:

方案一:使用窗口函数(适用于MySQL 8.0+、PostgreSQL、SQL Server等)

利用窗口函数LAG()对比当前记录与上一条的type,生成分组标识后汇总:

WITH grouped_data AS (
    SELECT
        id,
        type,
        quantity,
        -- 生成连续分组ID:当前type与上一条不同时,分组ID递增
        SUM(CASE WHEN type != LAG(type, 1, '') OVER (ORDER BY id) THEN 1 ELSE 0 END) OVER (ORDER BY id) AS group_id
    FROM your_table_name
)
SELECT
    MAX(id) AS id, -- 取每组最后一条记录的id(与示例结果一致)
    type,
    SUM(quantity) AS quantity
FROM grouped_data
GROUP BY group_id, type
ORDER BY MAX(id);

代码解释:

  • LAG(type, 1, '') OVER (ORDER BY id):获取当前记录的上一条记录的type,第一条记录默认用空字符串填充
  • CASE WHEN type != ... THEN 1 ELSE 0 END:若当前type与上一条不同,标记为1,否则为0
  • SUM(...) OVER (ORDER BY id):累计标记值,得到连续同类型的分组ID,同一组的group_id完全相同
  • 最后按group_id和type分组,求和quantity,并按id排序输出结果

方案二:使用变量(适用于MySQL 5.x等不支持窗口函数的版本)

通过自定义变量维护分组ID和上一条记录的type:

SELECT
    MAX(id) AS id,
    type,
    SUM(quantity) AS quantity
FROM (
    SELECT
        id,
        type,
        quantity,
        @group_id := CASE WHEN @prev_type != type THEN @group_id + 1 ELSE @group_id END AS group_id,
        @prev_type := type
    FROM your_table_name,
         (SELECT @group_id := 0, @prev_type := '') AS init_vars
    ORDER BY id
) AS grouped_data
GROUP BY group_id, type
ORDER BY MAX(id);

运行结果

两种方案均会输出与你期望一致的结果:

idtypequantity
3buy10
4sell4
5buy3
7sell2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:15:36