📜  MySQL |排名功能

📅  最后修改于: 2021-09-09 11:13:32             🧑  作者: Mango

MySql 中的排序函数用于对分区的每一行进行排序。排名函数也是 MySQL windows 函数列表的一部分。

  • 这些函数总是与OVER()子句一起使用。
  • 排名函数总是根据ORDER BY子句分配排名。
  • 排名以顺序方式分配给行。
  • 对于每个新分区,对行的排名总是从 1 开始。

MySQL 支持 3 种类型的排名函数 –

  1. 密集排名():
    此函数将无间隙地为分区内的每一行分配等级。基本上,等级是以连续的方式分配的,即如果值之间存在平局,那么它们将被分配相同的等级,并且下一个等级值将比前一个分配的等级大一个。
  2. 秩():
    此函数将为具有间隙的分区中的每一行分配等级。在这里,排名以非连续的方式分配,即如果值之间存在联系,那么它们将被分配相同的排名,并且下一个排名值将是前一个排名+对等点的数量(重复)。
  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

查询:

  1. 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。

  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。

  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。