logo图片
MySql教程
MySql用户管理
MySQL数据库
MySql表格和视图
MySQL查询
MySQL索引
MySQL子句
MySQL授权
MySql控制流
MySQL条件
MySQL连接
MySQL键
MySQL触发器
MySQL聚合函数
MySQL常用
MySQL正则表达式
MySql差异性

MySQL 排名函数

MySQL使用排名功能,使我们可以 对数据库中分区的每一行进行排名。排名函数还是MySQL窗口函数的一部分。 MySQL中的排名函数可以与以下子句一起使用:
他们始终使用 OVER() 他们根据 ORDER BY 为每一行分配一个等级。 他们按顺序为每行分配一个排名。 他们总是为行分配一个等级,每个新分区都从一个等级开始。
注意: 应该注意的是,自8.0版本开始,MySQL提供了对排名和窗口函数的支持。
MySQL 支持以下三种类型的排名功能:
密集排名 排名 排名百分比
现在,我们将详细讨论每个排名函数:

MySQL density_rank()

这是分配一个分区或结果集中每一行的排名,没有任何间隔。行的排名始终按 连续的顺序分配(从上一行开始增加一个)。有时您会在两个值之间取得平局,然后density_rank会为其分配相同的等级,而其下一个等级将是其下一个连续数字。
以下是density_rank()的语法:
SELECT column_name 
DENSE_RANK() OVER (
    PARTITION BY expression
    ORDER BY expression [ASC|DESC])
AS 'my_rank' FROM table_name;
在以上语法中,PARTITION BY子句将结果集按FROM子句进行分区,然后在每个分区上应用density_rank函数。接下来, ORDER BY子句应用于每个分区,以指定行的顺序。
示例1
让我们了解MySQL density_rank()函数的工作方式。因此,首先,创建一个包含以下数据的表:
表: employees
MySQL排名函数
此语句使用density_rank()函数为每一行分配排名值。
SELECT emp_id, emp_name, city, emp_age,
DENSE_RANK() OVER (ORDER BY emp_age) dens_rank
FROM employees;
执行上面的语句后,我们将获得以下输出:
MySQL排名函数

示例2

让我们看看另一个将结果集划分为多个分区的示例。以下语句使用density_rank()函数为每一行分配值,并使用 emp_age 将结果集划分为分区:
SELECT emp_id, emp_name, city, emp_age,
DENSE_RANK() OVER (PARTITION BY emp_age ORDER BY city) dens_rank
FROM employees;
成功执行上述查询后,我们将获得以下输出:
MySQL排名函数

MySQL rank()

该函数可为分区或结果集中带有间隙的每一行分配等级。行的等级始终不按连续顺序分配(即,与前一行相比增加1)。有时,您会在两个值之间找到一个纽带,然后rank()函数将为它分配相同的等级,而下一个等级将是其上一个等级加上一些重复的数字。
以下是rank()的语法:
SELECT column_name 
RANK() OVER (
    PARTITION BY expression
    ORDER BY expression [ASC|DESC])
AS 'my_rank' FROM table_name;
在上面的语法中,PARTITION BY子句对结果集进行分区,该结果集由 FROM子句返回,然后由等级()函数适用于每个分区,并在分区边界与其他分区交叉时重新初始化。接下来,在每个分区上应用ORDER BY子句,以基于一个或多个列名对行进行排序。
让我们看一下我们之前创建的表,看看rank()的工作原理="https://www.lidihuo.com/mysql-functions"> MySQL中的功能(带有不同的示例)。
表: 员工
MySQL排名函数

示例1

该语句使用rank( )函数为每一行分配等级值。
SELECT emp_id, emp_name, city, emp_age,
RANK() OVER (ORDER BY emp_age) my_rank
FROM employees;
上面的查询将给出以下输出:
MySQL排名函数

示例2

让我们看看另一个将结果集划分为多个分区的示例。以下语句使用rank()函数在每一行上分配值,并使用 emp_age 将结果集划分为分区,并根据 emp_id 对它们进行排序:
SELECT *,
RANK() OVER (PARTITION BY emp_age ORDER BY emp_id) my_rank
FROM employees;
执行上面的语句,我们将获得以下输出:
MySQL排名函数

MySQL percent_rank()

该函数可为分区或结果集中的行计算 百分等级(相对等级)。此函数返回一个介于0到1之间的值的数字。
以下是percent_rank()的语法:
SELECT column_name 
PERCENT_RANK() OVER (
    PARTITION BY expression
    ORDER BY expression [ASC|DESC])
AS 'my_rank' FROM table_name;
对于指定的行,此函数使用以下公式计算排名:
(rank-1) / ( total_rows-1)
在这里
等级: 是通过rank()函数返回的每一行的等级。
总行数: 它表示分区中存在的总行数。
注意: 这是确保使用此函数时,必须必须使用ORDER BY子句。否则,所有行均被视为重复行,并分配相同的等级,即1、
让我们创建一个包含以下数据的"学生"表,并查看MySQL中percent_rank()函数的工作情况。
表: 学生
MySQL排名函数

示例1

该语句使用percent_rank()函数来计算按标记列的每个行顺序的排名值。
SELECT stud_id, stud_name, subject, marks,
PERCENT_RANK() OVER (PARTITION BY subject ORDER BY marks) my_rank
FROM students;
上面的查询将提供以下输出:
MySQL排名函数
查看上面的公式如何工作,请考虑以下查询:
SELECT stud_id, stud_name, subject, marks, rank() 
OVER ( partition by subject order by marks )-1 
AS 'rank-1', count(*) over (partition by subject)-1
AS 'total_rows-1', 
PERCENT_RANK() OVER (PARTITION BY subject ORDER BY marks) my_rank
FROM students;
它将给出以下输出:
MySQL排名函数
昵称: 邮箱:
Copyright © 2020 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4