窗口函数 RANK

本文介绍了SQL Server窗口函数的应用场景,特别是RANK函数在成绩排名中的使用。通过具体实例展示了如何进行成绩排名以及获取每门课程的前三名学生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一直在了解与学习sqlserver 窗口函数的各种知识,发现窗口函数能够很方便实现在之前可能需要关联子查询等一些复杂的逻辑才能实现的逻辑,下边是自己的一些学习笔记。

 

RANK函数:从小到大,每次最苦逼的就是考试了,肿么都会有一个结果排名,张三数学第一,李四、小明并列第二...。这应该是我们最早接触到的排名概念,sqlserver 中rank 也是这样的意思,和row_number() 区别就是rownum会为每个分区值相同的去一个随机排名,即排名不会存在并列的情况

 

创建一个数据表:包含班级编号、课程编号、学生编号、学生成绩(T_StudentGrade  ClassId ,CourseId ,StudentId ,SGrade )

 

1:获得每个班级,每门课程同学们的成绩排名情况(成绩相同,并列排名)

1 SELECT  id ,
2         ClassId ,
3         CourseId ,
4         StudentId ,
5         SGrade ,
6         RANK() OVER ( PARTITION BY ClassId, CourseId ORDER BY SGrade DESC ) AS rownum
7 FROM    dbo.T_StudentGrade;
View Code

 

2:获得每门课程的排名前三学生情况

1 WITH tmpTable AS (
2 SELECT  id ,
3         ClassId ,
4         CourseId ,
5         StudentId ,
6         SGrade ,
7         RANK() OVER ( PARTITION BY CourseId ORDER BY SGrade DESC ) AS ScoreRank
8 FROM    dbo.T_StudentGrade)
9 SELECT * FROM tmpTable WHERE tmpTable.ScoreRank<4
View Code

 

转载于:https://www.cnblogs.com/wawa0210/p/6057871.html

### 关于SQL窗口函数RANK的实际案例 `RANK()` 是一种常见的窗口函数,用于为查询结果中的每一行分配一个排名。如果存在相同值的行,则这些行会获得相同的排名,并且后续行的排名将会跳跃。以下是 `RANK()` 的实际使用案例。 #### 示例场景:员工薪资排名 假设有一个名为 `employees` 的表,其中包含以下字段: - `id`: 员工ID - `name`: 员工姓名 - `department`: 部门名称 - `salary`: 薪资金额 需求是按部门对员工薪资进行降序排名,并显示每名员工在其所在部门内的薪资排名。 ##### 查询语句 ```sql SELECT id, name, department, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_within_department FROM employees; ``` 在这个例子中: - `PARTITION BY department` 表示按照部门划分数据[^3]。 - `ORDER BY salary DESC` 表示在每个部门内部根据薪资从高到低排序[^3]。 - `RANK()` 函数为每个部门内的员工分配排名,当两名或多名员工拥有相同的薪资时,他们将共享同一个排名,而下一名次则会被跳过[^2]。 #### 输出样例 假设有如下数据: | id | name | department | salary | |------|----------|------------|--------| | 1 | Alice | HR | 7000 | | 2 | Bob | IT | 9000 | | 3 | Charlie | HR | 8000 | | 4 | Diana | IT | 9000 | | 5 | Edward | IT | 8000 | 执行上述查询后得到的结果可能是这样的: | id | name | department | salary | rank_within_department | |------|----------|------------|--------|-------------------------| | 3 | Charlie | HR | 8000 | 1 | | 1 | Alice | HR | 7000 | 2 | | 2 | Bob | IT | 9000 | 1 | | 4 | Diana | IT | 9000 | 1 | | 5 | Edward | IT | 8000 | 3 | 注意,在 IT 部门中,Bob Diana 拥有相同的薪资,因此他们的排名均为 1,Edward 则被赋予了第 3 名的排名,而不是第 2 名[^2]。 --- ### 另一实例:Top-N 查询 有时我们希望获取某个分组内排名靠前的数据记录。例如,找出每个部门薪资最高的前三名员工。 ##### 查询语句 ```sql WITH ranked_employees AS ( SELECT id, name, department, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_within_department FROM employees ) SELECT * FROM ranked_employees WHERE rank_within_department <= 3; ``` 在此查询中: - 使用了一个公共表表达式(CTE),即 `ranked_employees`,来存储带有排名的信息。 - 外层查询过滤掉那些排名超过 3 的记录[^4]。 通过这种方式可以轻松实现基于窗口函数的复杂筛选逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值