MySql 中的排序函数用于对分区的每一行进行排序。排名函数也是 MySQL windows 函数列表的一部分。
- 这些函数总是与OVER()子句一起使用。
- 排名函数总是根据ORDER BY子句分配排名。
- 排名以顺序方式分配给行。
- 对于每个新分区,对行的排名总是从 1 开始。
MySQL 支持 3 种类型的排名函数 –
- 密集排名():
此函数将无间隙地为分区内的每一行分配等级。基本上,等级是以连续的方式分配的,即如果值之间存在平局,那么它们将被分配相同的等级,并且下一个等级值将比前一个分配的等级大一个。 - 秩():
此函数将为具有间隙的分区中的每一行分配等级。在这里,排名以非连续的方式分配,即如果值之间存在联系,那么它们将被分配相同的排名,并且下一个排名值将是前一个排名+对等点的数量(重复)。 - 百分比排名():
它返回分区内行的百分位等级,范围从 0 到 1。它告诉分区值小于当前行中的值的百分比,不包括最高值。
为了更好地理解这些功能。
让我们考虑一个表“结果” ——
s_name | subjects | mark |
---|---|---|
Pratibha | Maths | 100 |
Ankita | Science | 80 |
Swarna | English | 100 |
Ankita | Maths | 65 |
Pratibha | Science | 80 |
Swarna | Science | 50 |
Pratibha | English | 70 |
Swarna | Maths | 85 |
Ankita | English | 90 |
查询:
- Dense_rank()函数-
SELECT subjects, s_name, mark, dense_rank() OVER ( partition by subjects order by mark desc ) AS 'dense_rank' FROM result;
输出-
Subjects Name Mark Dense_rank English Swarna 100 1 English Ankita 90 2 English Pratibha 70 3 Maths Pratibha 100 1 Maths Swarna 85 2 Maths Ankita 65 3 Science Ankita 80 1 Science Pratibha 80 1 Science Swarna 50 2 解释-
在这里,表是基于“主题”进行分区的。
order by子句用于按“标记”按降序排列每个分区的行。
Dense_rank()用于对每个科目的学生进行排名。
请注意,对于科学科目,Ankita 和 Pratibha 之间存在联系,因此它们都被分配了相同的等级。下一个等级值增加 1,即 Swarna 的 2。
- rank()函数-
SELECT subjects, s_name, mark, rank() OVER ( partition by subjects order by mark desc ) AS 'rank' FROM result;
输出-
Subjects Name Mark rank English Swarna 100 1 English Ankita 90 2 English Pratibha 70 3 Maths Pratibha 100 1 Maths Swarna 85 2 Maths Ankita 65 3 Science Ankita 80 1 Science Pratibha 80 1 Science Swarna 50 3 解释-
它的输出类似于dense_rank()函数。
除了在 Ankita 和 Pratibha 之间出现平局的情况下,Science 科目的下一个排名值增加 2,即 Swarna 的 3。
- percent_rank()函数-
SELECT subjects, s_name, mark, percent_rank() OVER ( partition by subjects order by mark ) AS 'percent_rank' FROM result;
输出-
Subjects Name Mark percent_rank English Pratibha 70 0 English Ankita 90 0.5 English Swarna 100 1 Maths Ankita 65 0 Maths Swarna 85 0.5 Maths Pratibha 100 1 Science Swarna 50 0 Science Pratibha 80 0.5 Science Ankita 80 0.5 解释:
此处, percent_rank()函数按“mark”列按升序计算百分位排名。
percent_rank 使用以下公式计算 –
(rank - 1) / (rows - 1)
rank是使用 rank()函数得出的分区的每一行的排名。
行表示该分区中的行数。
要清除此公式,请考虑以下查询-
SELECT subjects, s_name, mark, rank() OVER ( partition by subjects order by mark )-1 AS 'rank-1', count(*) over (partition by subjects)-1 AS 'total_rows-1', percent_rank() OVER ( partition by subjects order by mark ) AS 'percenr_rank' FROM result;
输出-
Subjects Name Mark rank-1 total_rows-1 percent_rank English Pratibha 70 0 2 0 English Ankita 90 1 2 0.5 English Swarna 100 2 2 1 Maths Ankita 65 0 2 0 Maths Swarna 85 1 2 0.5 Maths Pratibha 100 2 2 1 Science Swarna 50 0 2 0 Science Ankita 80 1 2 0.5 Science Pratibha 80 1 2 0.5 注意:在使用排名函数,在 MySQL 查询中必须使用 order by 子句,否则所有行都被认为是对等的,即(重复),并且所有行都被分配相同的排名,即 1。