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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:33:20