row_number
### row_number() 函数详解及应用 #### 一、row_number()函数介绍 `row_number()` 是 SQL 中的一个窗口函数,常用于为查询结果中的每一行分配一个唯一且连续的整数编号。这个函数通常与 `OVER()` 子句一起使用来定义编号规则。 #### 二、row_number() 的语法结构 `row_number()` 函数的基本语法结构如下: ```sql ROW_NUMBER () OVER ( [PARTITION BY partition_expression, ...] ORDER BY sort_expression [ASC | DESC], ... ) ``` - **PARTITION BY**:用于指定对结果集进行分区的标准。可以基于一个或多个列进行分区。 - **ORDER BY**:指定在每个分区内部的排序规则。可以是升序 (ASC) 或降序 (DESC),默认为升序。 #### 三、row_number() 函数应用场景 ##### 1. 实例解析 以题目中给出的数据表 `employee` 为例,该表包含以下字段:`empid`(员工ID)、`deptid`(部门ID) 和 `salary`(薪资)。 ```sql CREATE TABLE employee( empid INT, deptid INT, salary DECIMAL(10,2) ); INSERT INTO employee VALUES(1, 10, 5500.00); INSERT INTO employee VALUES(2, 10, 4500.00); INSERT INTO employee VALUES(3, 20, 1900.00); INSERT INTO employee VALUES(4, 20, 4800.00); INSERT INTO employee VALUES(5, 40, 6500.00); INSERT INTO employee VALUES(6, 40, 14500.00); INSERT INTO employee VALUES(7, 40, 44500.00); INSERT INTO employee VALUES(8, 50, 6500.00); INSERT INTO employee VALUES(9, 50, 7500.00); ``` ##### 2. 需求分析 需求是根据部门分组,并显示每个部门的工资等级。这里我们可以理解为按部门对员工的薪资进行排序,并给出排序结果,即每个部门内薪资最高的员工被赋予最低的排名,以此类推。 ```sql SELECT *, ROW_NUMBER() OVER (PARTITION BY deptid ORDER BY salary DESC) AS rank FROM employee; ``` 这条 SQL 语句的作用是: - 使用 `PARTITION BY deptid` 对数据按照 `deptid` 进行分组。 - 使用 `ORDER BY salary DESC` 在每个部门内部按照薪资降序排列。 - `ROW_NUMBER()` 为每个分组内的行分配一个唯一的顺序编号。 ##### 3. 查询结果分析 执行上述 SQL 语句后,我们可以得到每个部门内薪资排名的结果。例如: - 对于部门 10,员工 1 的薪资最高,其 rank 值为 1;员工 2 的薪资次之,rank 值为 2。 - 对于部门 20,员工 4 的薪资最高,其 rank 值为 1;员工 3 的薪资最低,rank 值为 2。 - 以此类推。 通过这种方式,我们可以清晰地了解到每个部门内部员工薪资的排序情况。 #### 四、拓展应用 除了上述例子中的用法外,`row_number()` 还有其他一些常见的应用场景: 1. **去重查询**:结合 `ROW_NUMBER()` 和 `UNION ALL` 可以实现去除重复记录并保留所有字段的功能。 2. **分页查询**:通过 `ROW_NUMBER()` 结合 `WHERE` 子句可以实现简单的分页功能,比如获取第一页的数据,每页显示 10 条记录。 3. **复杂排序**:当需要对多列进行排序时,可以利用 `ROW_NUMBER()` 来实现复杂的排序逻辑。 `row_number()` 函数在 SQL 中的应用非常广泛,不仅可以帮助我们快速解决数据排序问题,还能在更复杂的场景下发挥重要作用。掌握好这一函数的使用方法,对于提升 SQL 技能大有裨益。