分区函数Partition By
约 267 字小于 1 分钟
2025-02-02
PARTITION BY 用于对数据进行分区(分组),使窗口函数在每个分区内独立计算,而不会影响其他分区的数据。分区函数一般与排名函数一起使用。
score表
数据
| id | userId | score |
|---|---|---|
| 1 | 1 | 100 |
| 2 | 2 | 90 |
| 3 | 3 | 95 |
| 4 | 1 | 92 |
| 5 | 2 | 92 |
| 6 | 3 | 100 |
sql语句
DROP TABLE if EXISTS score;
CREATE TABLE score (
id int PRIMARY KEY AUTO_INCREMENT,
userId int NOT NULL,
score int NOT NULL
);
INSERT INTO score (userId, score)
VALUES (1, 100),
(2, 90),
(3, 95),
(1, 92),
(2, 92),
(3, 100);不分组 RANK
SELECT *, RANK() OVER (ORDER BY score DESC) AS `rank` FROM score;| id | userId | score | rank |
|---|---|---|---|
| 1 | 1 | 100 | 1 |
| 6 | 3 | 100 | 1 |
| 3 | 3 | 95 | 3 |
| 4 | 1 | 92 | 4 |
| 5 | 2 | 92 | 4 |
| 2 | 2 | 90 | 6 |
分组后 RANK
SELECT *, RANK() OVER (PARTITION BY userId ORDER BY score DESC) AS `rank` FROM score;| id | userId | score | rank |
|---|---|---|---|
| 1 | 1 | 100 | 1 |
| 4 | 1 | 92 | 2 |
| 5 | 2 | 92 | 1 |
| 2 | 2 | 90 | 2 |
| 6 | 3 | 100 | 1 |
| 3 | 3 | 95 | 2 |
获取每个分组的前1(n)条数据
SELECT *
FROM (
SELECT *, RANK() OVER (PARTITION BY userId ORDER BY score DESC) AS `rank`
FROM score
) t
WHERE t.rank <= 1;