1. row_number函数概述
row_number函数是SQL Server中的常见窗口函数之一,它可以根据指定的列对结果集进行排序并为每一行分配一个唯一的数字。该函数的基本语法如下:
ROW_NUMBER() OVER (ORDER BY [column1] [, column2, …]) AS [row_num]
其中,column1、column2等表示要按照哪一列(或列的组合)升序或降序排序,row_num表示为每一行分配的唯一数字。
2. row_number函数应用场景
row_number函数主要用于以下场景:
2.1 对结果集进行分页
通过row_number函数,我们可以为结果集中的每一行分配一个唯一的数字,然后根据该数字进行分页处理。例如,我们想获取第11~20行的结果,可以使用以下代码:
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY [Salary] DESC) AS [row_num]
FROM [Employee]
) AS [temp]
WHERE [row_num] BETWEEN 11 AND 20;
上面的代码中,我们使用了内部查询获取了包含编号字段的结果集,然后在外部查询中使用了WHERE子句过滤第11~20行的结果。
2.2 按照特定规则对结果集进行排序
row_number函数可以根据指定的列对结果集进行排序,并且不会影响到原始表中的数据。例如,我们想获取工资最高的前5名员工信息,可以使用以下代码:
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY [Salary] DESC) AS [row_num]
FROM [Employee]
) AS [temp]
WHERE [row_num] <= 5;
上面的代码中,我们根据工资降序排序,并分配了唯一的数字。然后在外部查询中使用WHERE子句过滤了排名前5的员工信息。
2.3 实现分组排名
我们也可以使用row_number函数实现对分组后的数据进行排名。例如,我们想获取每个部门工资最高的员工信息,可以使用以下代码:
SELECT [DeptName], [EmpName], [Salary], [row_num]
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY [DepartmentId] ORDER BY [Salary] DESC) AS [row_num]
FROM [Employee]
) AS [temp]
WHERE [row_num] = 1;
上面的代码中,我们使用PARTITION BY子句对每个部门进行分组,并根据工资降序排序。然后在外部查询中使用WHERE子句过滤排名为1的员工信息,即每个部门工资最高的员工信息。