## SQL Server RANK 函数详解### 简介在 SQL Server 中,`RANK` 函数是一个窗口函数,用于根据指定排序返回结果集中每一行的排名。与 `ROW_NUMBER` 函数为每一行生成唯一排名不同,`RANK` 函数会为排名相同的值赋予相同的排名,并在下一个排名处跳过相应的排名数字。### 语法```sql RANK () OVER ( [PARTITION BY partition_expression] ORDER BY sort_expression [ASC | DESC]) ```
PARTITION BY
:可选参数,用于将结果集划分为多个分区,并在每个分区内进行排名。
ORDER BY
:必选参数,用于指定排名的依据,可以包含多个排序表达式。
ASC | DESC
:可选参数,用于指定升序(ASC)或降序(DESC)排序,默认为 ASC。### 使用示例
1. 基本排名
假设我们有一个名为 `Employees` 的表,包含以下数据:| Name | Department | Salary | | :------ | :--------- | :----- | | Alice | Sales | 60000 | | Bob | Marketing | 50000 | | Charlie | Sales | 60000 | | David | IT | 70000 | | Eve | Marketing | 45000 |我们可以使用 `RANK` 函数根据 `Salary` 对员工进行排名:```sql SELECT Name, Department, Salary,RANK() OVER (ORDER BY Salary DESC) AS Rank FROM Employees; ```结果如下:| Name | Department | Salary | Rank | | :------ | :--------- | :----- | :--- | | David | IT | 70000 | 1 | | Alice | Sales | 60000 | 2 | | Charlie | Sales | 60000 | 2 | | Bob | Marketing | 50000 | 4 | | Eve | Marketing | 45000 | 5 |可以看到,Alice 和 Charlie 的薪水相同,因此他们共享排名 2,而下一个排名则跳过 3 直接到 4。
2. 分区排名
我们可以使用 `PARTITION BY` 子句根据 `Department` 对员工进行分组排名:```sql SELECT Name, Department, Salary,RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) AS Rank FROM Employees; ```结果如下:| Name | Department | Salary | Rank | | :------ | :--------- | :----- | :--- | | Alice | Sales | 60000 | 1 | | Charlie | Sales | 60000 | 1 | | David | IT | 70000 | 1 | | Bob | Marketing | 50000 | 1 | | Eve | Marketing | 45000 | 2 |可以看到,每个部门内的员工都根据 `Salary` 进行了排名。### `RANK` 与其他排名函数的区别
ROW_NUMBER
:为每一行生成唯一的排名,即使值相同。
DENSE_RANK
:与 `RANK` 类似,但不会跳过排名数字。
NTILE
:将结果集分成指定数量的组,并为每个组内的行赋予相同的排名。### 总结`RANK` 函数是 SQL Server 中一个强大的窗口函数,可以用于根据指定排序对结果集进行排名。通过结合使用 `PARTITION BY` 子句和不同的排序表达式,可以灵活地满足各种排名需求。
SQL Server RANK 函数详解
简介在 SQL Server 中,`RANK` 函数是一个窗口函数,用于根据指定排序返回结果集中每一行的排名。与 `ROW_NUMBER` 函数为每一行生成唯一排名不同,`RANK` 函数会为排名相同的值赋予相同的排名,并在下一个排名处跳过相应的排名数字。
语法```sql RANK () OVER ( [PARTITION BY partition_expression] ORDER BY sort_expression [ASC | DESC]) ```* **PARTITION BY**:可选参数,用于将结果集划分为多个分区,并在每个分区内进行排名。 * **ORDER BY**:必选参数,用于指定排名的依据,可以包含多个排序表达式。 * **ASC | DESC**:可选参数,用于指定升序(ASC)或降序(DESC)排序,默认为 ASC。
使用示例**1. 基本排名**假设我们有一个名为 `Employees` 的表,包含以下数据:| Name | Department | Salary | | :------ | :--------- | :----- | | Alice | Sales | 60000 | | Bob | Marketing | 50000 | | Charlie | Sales | 60000 | | David | IT | 70000 | | Eve | Marketing | 45000 |我们可以使用 `RANK` 函数根据 `Salary` 对员工进行排名:```sql SELECT Name, Department, Salary,RANK() OVER (ORDER BY Salary DESC) AS Rank FROM Employees; ```结果如下:| Name | Department | Salary | Rank | | :------ | :--------- | :----- | :--- | | David | IT | 70000 | 1 | | Alice | Sales | 60000 | 2 | | Charlie | Sales | 60000 | 2 | | Bob | Marketing | 50000 | 4 | | Eve | Marketing | 45000 | 5 |可以看到,Alice 和 Charlie 的薪水相同,因此他们共享排名 2,而下一个排名则跳过 3 直接到 4。**2. 分区排名**我们可以使用 `PARTITION BY` 子句根据 `Department` 对员工进行分组排名:```sql SELECT Name, Department, Salary,RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) AS Rank FROM Employees; ```结果如下:| Name | Department | Salary | Rank | | :------ | :--------- | :----- | :--- | | Alice | Sales | 60000 | 1 | | Charlie | Sales | 60000 | 1 | | David | IT | 70000 | 1 | | Bob | Marketing | 50000 | 1 | | Eve | Marketing | 45000 | 2 |可以看到,每个部门内的员工都根据 `Salary` 进行了排名。
`RANK` 与其他排名函数的区别* **ROW_NUMBER**:为每一行生成唯一的排名,即使值相同。 * **DENSE_RANK**:与 `RANK` 类似,但不会跳过排名数字。 * **NTILE**:将结果集分成指定数量的组,并为每个组内的行赋予相同的排名。
总结`RANK` 函数是 SQL Server 中一个强大的窗口函数,可以用于根据指定排序对结果集进行排名。通过结合使用 `PARTITION BY` 子句和不同的排序表达式,可以灵活地满足各种排名需求。