如何按连续相同的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,否则为0SUM(...) 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);
运行结果
两种方案均会输出与你期望一致的结果:
| id | type | quantity |
|---|---|---|
| 3 | buy | 10 |
| 4 | sell | 4 |
| 5 | buy | 3 |
| 7 | sell | 2 |
内容的提问来源于stack exchange,提问作者bakis
相关产品推荐
相关产品推荐

