首页/数据/SQL 速查/组内计数广播 COUNT(*) OVER
本包目录(311 条)
查询基础33 条连接与子查询40 条
聚合与窗口函数54 条
函数速查60 条变更与事务52 条性能与执行计划72 条

组内计数广播 COUNT(*) OVER

不改行数地给每行附上组内统计(组大小、组内极值),常用于占比、排名并列判断与数据探查。

SQL 速查数据更新于 2026-10-12

示例

示例
SELECT id, user_id, amount,
       COUNT(*)            OVER (PARTITION BY user_id) AS user_orders,
       SUM(amount)         OVER (PARTITION BY user_id) AS user_total,
       MAX(amount)         OVER (PARTITION BY user_id) AS user_max,
       COUNT(*)            OVER ()                      AS total_rows
FROM orders;
组内计数PARTITION BY 后不加 ORDER BY:整组统计
全表计数OVER () 不分区
注意加 ORDER BY 会变成累计计数

易错点

  • 写了 ORDER BY 之后 COUNT(*) OVER 变成“截至当前行”的累计计数,不是组大小
  • 同一查询里多次开窗统计会重复计算,数据量大时关注执行计划

数据来源与参考

  • MySQL 8.0 Reference Manual · Window Functions
  • PostgreSQL Documentation · Window Functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌