严格前 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 行 |
| 写法 | 先编号后外层过滤 |