1.使用ORDER BY子句:可以在开窗函数中使用ORDER BY子句对结果进行排序。排名从1开始递增。
2.使用RANK()函数:RANK()函数会为相同值的数据生成相同的排名,并跳过下一个排名。
3.使用DENSE_RANK()函数:DENSE_RANK()函数会为相同值的数据生成相同的排名,并不跳过下一个排名。
在具体示例中,假设我们有以下数据表employees:
+----+------+--------+
| id | name | salary |
+----+------+--------+
| 1 | John | 3000 |
| 2 | Jane | 4000 |
| 3 | Mary | 3500 |
| 4 | Mark | 4000 |
+----+------+--------+
1. 使用ROW_NUMBER()函数的排名示例:
SELECT id, name, salary, ROW_NUMBER() OVER (ORDER BY salary) AS rank
FROM employees;
结果:
+----+------+--------+------+
| id | name | salary | rank |
+----+------+--------+------+
| 1 | John | 3000 | 1 |
| 3 | Mary | 3500 | 2 |
| 2 | Jane | 4000 | 3 |
| 4 | Mark | 4000 | 4 |
+----+------+--------+------+
2. 使用RANK()函数的排名示例:
SELECT id, name, salary, RANK() OVER (ORDER BY salary) AS rank
FROM employees;
结果:
+----+------+--------+------+
| id | name | salary | rank |
+----+------+--------+------+
| 1 | John | 3000 | 1 |
| 3 | Mary | 3500 | 2 |
| 2 | Jane | 4000 | 3 |
| 4 | Mark | 4000 | 3 |
+----+------+--------+------+
3. 使用DENSE_RANK()函数的排名示例:
SELECT id, name, salary, DENSE_RANK() OVER (ORDER BY salary) AS rank
FROM employees;
结果:
+----+------+--------+------+
| id | name | salary | rank |
+----+------+--------+------+
| 1 | John | 3000 | 1 |
| 3 | Mary | 3500 | 2 |
| 2 | Jane | 4000 | 3 |
| 4 | Mark | 4000 | 3 |
+----+------+--------+------+
根据以上示例,可以看出:
- ROW_NUMBER()函数会为每一行数据生成一个唯一的排名。
- RANK()函数会为相同值的数据生成相同的排名,并跳过下一个排名。
- DENSE_RANK()函数会为相同值的数据生成相同的排名,并不跳过下一个排名。