在开发过程中,经常会遇到对分数进行排名的需求,通常的写法大部分都是子查询,而窗口函数可以更加便利的进行分数排列.
窗口函数
窗口函数是一种在查询结果集的特定窗口或分组中计算结果的函数。它可以根据指定的排序规则和窗口范围进行计算,并返回每个行的结果。
窗口函数通常与OVER子句一起使用,该子句定义窗口的范围。窗口可以根据行的排序顺序、分组或指定的条件进行定义。
常见的窗口函数包括:
- RANK():计算行在排序结果中的排名。
- DENSE_RANK():计算行在排序结果中的稠密排名,即相同的值将得到相同的排名,没有间隔。
- ROW_NUMBER():为查询结果中的每一行分配一个唯一的数字。
- SUM()、AVG()、MIN()、MAX():计算窗口中指定列的总和、平均值、最小值、最大值。
- LEAD()、LAG():获取指定列在窗口中的后一行或前一行的值。
- FIRST_VALUE()、LAST_VALUE():获取窗口中指定列的第一个值或最后一个值。
窗口函数可以用于各种情况,例如计算排名、累计求和、计算移动平均等。它们提供了一种在查询结果中执行复杂计算的灵活且高效的方式。
窗口函数不同于普通的聚合函数,它们在计算结果时不会引起行的合并或分组。相反,它们为每一行计算结果,并将结果附加到查询结果中的每一行。这使得窗口函数可以提供更详细和精确的计算结果。
实例
表: Scores
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| score | decimal |
+-------------+---------+
在 SQL 中,id 是该表的主键。
该表的每一行都包含了一场比赛的分数。Score 是一个有两位小数点的浮点值。
查询并对分数进行排序。排名按以下规则计算:
分数应按从高到低排列。
如果两个分数相等,那么两个分数的排名应该相同。
在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
按 score 降序返回结果表。
一般解法
select s1.score,
(select count(distinct score) from Scores s2 where s1.score <= s2.score) as 'rank'
from Scores s1
order by score desc
窗口函数
select score,
dense_rank() over (order by score desc) as 'rank'
from Scores
延伸
获取排名第一的
如果你只想获取排名第一的结果,可以在窗口函数中使用条件来筛选出排名为1的行。具体来说,可以在窗口函数的OVER子句中添加一个WHERE子句来过滤排名为1的行。
以下是一个示例查询,它选择Scores表中排名第一的Score值:
```sql
SELECT Score
FROM (
SELECT Score, DENSE_RANK() OVER (ORDER BY Score DESC) AS Rank
FROM Scores
) AS RankedScores
WHERE Rank = 1;
在这个查询中,首先使用内部查询将Scores表中的Score列和对应的排名计算出来。然后,外部查询从内部查询的结果中选择排名为1的Score值。这样就只会返回排名第一的结果。
注意,这里使用的是DENSE_RANK()函数,它可以处理具有相同Score值的情况,并确保相同的Score值都被分配相同的排名。如果使用RANK()函数,可能会出现不连续的排名,因为它会跳过相同的Score值。
标签:窗口,函数,查询,Score,Sql,排名,score
From: https://www.cnblogs.com/Dong-Dong-Xi/p/17711385.html