首页/数据/SQL 速查/每组取前 N 行
聚合与窗口函数54 条

每组取前 N 行

分组 Top N 的标准解法:ROW_NUMBER(严格 N 行)或 RANK(含并列)编号后在外层过滤,窗口函数不能直接写进 WHERE。

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

严格前 3 行

严格前 3 行
SELECT *
FROM (
    SELECT o.*,
           ROW_NUMBER() OVER (PARTITION BY user_id
                              ORDER BY amount DESC, id) AS rn
    FROM orders o
) t
WHERE t.rn <= 3;

含并列(前 3 名)

含并列(前 3 名)
SELECT *
FROM (
    SELECT o.*,
           RANK() OVER (PARTITION BY user_id ORDER BY amount DESC) AS rk
    FROM orders o
) t
WHERE t.rk <= 3;
ROW_NUMBER每个分区恰好 N 行
RANK并列名次一起保留,可能多于 N 行
写法先编号后外层过滤

易错点

  • 在 WHERE 里直接写窗口函数会报错:窗口函数与 GROUP BY 同层之后才计算
  • 并列值多时 ROW_NUMBER 的结果不稳定,判定规则需要与业务确认用 RANK 还是加次级排序键

数据来源与参考

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