每天一道SQL题
每天一道SQL题之day04
1、题目:
链接: 分数排名
表:Scores
Column Name | Type |
---|---|
id | int |
score | decimal |
在 SQL 中,id 是该表的主键。
该表的每一行都包含了一场比赛的分数。Score 是一个有两位小数点的浮点值。
查询并对分数进行排序。排名按以下规则计算:
- 分数应按从高到低排列。
- 如果两个分数相等,那么两个分数的排名应该相同。
- 在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
按 score
降序返回结果表。
示例 1:
输入:
Scores 表:
id | score |
---|---|
1 | 3.50 |
2 | 3.65 |
3 | 4.00 |
4 | 3.85 |
5 | 4.00 |
6 | 3.65 |
输出:
score | rank |
---|---|
4.00 | 1 |
4.00 | 1 |
3.85 | 2 |
3.65 | 3 |
3.65 | 3 |
3.50 | 4 |
2、题解
select score,
dense_rank() over(order by score desc) as 'rank'
from Scores
3、解析
-窗口函数语法:
window_function(expr) OVER(
partition by .....
order by .....
frame_clause ......
)
如果后面括号中什么都不写,则意味着窗口包含满足where
条件的所有行,窗口函数基于所有行进行计算;如果不为空,则有三个参数来设置窗口:
- partition by 子句:按照指定字段进行分区,两个分区由边界分隔,窗口函数在不同的分区内分别执行,在跨越分区边界时重新初始化。
- order by 子句:按照指定字段进行排序,窗口函数将按照排序后的记录顺序进行编号。
- frame 子句:当前分区的一个子集,用来定义子集的规则,通常用来作为滑动窗口使用。
另使用函数:dense_rank()
- 不间断的组内排序.使用这个函数时,可以出现1.1.2.2这种形式的分组。