SQL如何按列分组后仅在每组最后一行显示分组总数量
实现方法
直接使用GROUP BY无法实现该需求,因为GROUP BY会将同分组的多行聚合为单条返回,无法保留组内全部明细行。要保留所有明细、仅在组尾展示分组总数,使用窗口函数实现最简洁,兼容MySQL 8.0+、PostgreSQL、SQL Server、Oracle等绝大多数主流数据库。
核心逻辑
- 按
Name字段分区,计算每个分组的总数据条数 - 标记每个分组的最后一行(示例中按Id升序排列,Id最大的行即为组尾行)
- 仅在组尾行返回分组总数量,其余行返回
NULL
窗口函数实现代码
SELECT Id, Name, Data, CASE WHEN ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Id DESC) = 1 THEN COUNT(Id) OVER (PARTITION BY Name) ELSE NULL END AS `Total Quantity` FROM your_table ORDER BY Id;
低版本兼容写法(适用于不支持窗口函数的场景,如MySQL 5.x)
如果数据库版本不支持窗口函数,可以先通过子查询聚合出每个分组的总条数和组尾行Id,再关联原表完成赋值:
SELECT t1.Id, t1.Name, t1.Data, CASE WHEN t1.Id = t2.max_id THEN t2.total_cnt ELSE NULL END AS `Total Quantity` FROM your_table t1 LEFT JOIN ( SELECT Name, MAX(Id) AS max_id, COUNT(1) AS total_cnt FROM your_table GROUP BY Name ) t2 ON t1.Name = t2.Name ORDER BY t1.Id;
执行结果
运行上述代码后,返回结果与预期完全一致:
Id Name Data Total Quantity ----------------------------------------- 1 A A_data_1 null 2 A A_data_2 null 3 A A_data_3 3 4 B B_data_1 null 5 B B_data_2 2 6 C C_data_1 1
提示:如果你的组内排序规则不是按Id升序,只需调整
ROW_NUMBER()中的ORDER BY条件,匹配实际业务的排序规则即可。
内容的提问来源于stack exchange,提问作者Oscar Chua Wei Wen
相关产品推荐
相关产品推荐

