MySQL 排名函数
MySQL 使用排名函数,允许我们对数据库中分区的每一行进行排名。排名函数也是 MySQL 中窗口函数的子部分。MySQL 中的排名函数可以与以下子句一起使用:
- 他们总是使用OVER()
- 他们根据ORDER BY为每一行分配一个排名
- 他们按顺序为每一行分配一个等级。
- 他们总是为行分配一个等级,从每个新分区的一个开始。
注意:需要注意的是 MySQL 从 8.0 版本开始支持排名和窗口函数。
MySQL支持以下三种排序函数:
- Dense Rank
- Rank
- Percent Rank
现在,我们将详细讨论每个排名函数:
一、MySQL dense_rank() 函数
dense_rank() 函数是一个为分区或结果集中的每一行分配一个排名的函数,没有任何间隙。行的排名总是按连续顺序分配(从前一行增加一个)。有时您会在值之间获得平局,然后 dense_rank 将为其分配相同的排名,其下一个排名将是其下一个连续数字。
以下是 dense_rank() 的语法:
SELECT column_name
DENSE_RANK() OVER (
PARTITION BY expression
ORDER BY expression [ASC|DESC])
AS 'my_rank' FROM table_name;
在上述语法中,PARTITION BY 子句对 FROM 子句返回的结果集进行分区,然后对每个分区应用dense_rank 函数。接下来,ORDER BY 子句适用于每个分区以指定行的顺序。
示例 1
让我们了解 MySQL 的 dense_rank() 函数是如何工作的。因此,首先,创建一个包含以下数据的表:
employee表:
此语句使用 dense_rank() 函数为每一行分配排名值。
SELECT emp_id, emp_name, city, emp_age,
DENSE_RANK() OVER (ORDER BY emp_age) dens_rank
FROM employees;
执行上述语句后,我们会得到如下输出:
示例 2
让我们看另一个将结果集划分为分区的示例。以下语句使用 dense_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 rank() 函数
rank() 函数是一个为分区或结果集中有间隙的每一行分配排名的函数。行的排名总是不按连续顺序分配(即,从前一行增加一个)。有时您会在值之间获得平局,然后 rank() 函数将为它分配相同的排名,下一个排名值将是它的前一个排名加上一些重复的数字。
以下是 rank() 的语法:
SELECT column_name
RANK() OVER (
PARTITION BY expression
ORDER BY expression [ASC|DESC])
AS 'my_rank' FROM table_name;
在上述语法中,PARTITION BY 子句对FROM 子句返回的结果集进行分区, 然后 rank() 函数应用于每个分区,并在分区边界跨越其他分区时重新初始化。接下来,ORDER BY 子句应用于每个分区,以根据一个或多个列名称对行进行排序。
employee表:
示例 1
此语句使用 rank() 函数为每一行分配排名值。
SELECT emp_id, emp_name, city, emp_age,
RANK() OVER (ORDER BY emp_age) my_rank
FROM employees;
上面的查询将给出以下输出:
示例 2
让我们看另一个将结果集划分为分区的示例。以下语句使用 rank() 函数为每一行分配值,并使用emp_age将结果集划分为分区,并根据emp_id对它们进行排序:
SELECT *,
RANK() OVER (PARTITION BY emp_age ORDER BY emp_id) my_rank
FROM employees;
执行上面的语句,我们会得到如下输出:
三、MySQL percent_rank() 函数
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:是rank()函数返回的每一行的排名。
total_rows:它表示分区中存在的总行数。
注意:这是为了确保当您使用此功能时,您必须使用 ORDER BY 子句。否则,所有行都被视为重复并分配相同的等级,即 1。
让我们创建一个包含以下数据的表“students”,并查看 MySQL 中 percent_rank() 函数的工作情况。
students表:
示例 1
此语句使用 percent_rank() 函数计算每个行 order by 标记列的排名值。
SELECT stud_id, stud_name, subject, marks,
PERCENT_RANK() OVER (PARTITION BY subject ORDER BY marks) my_rank
FROM students;
上面的查询将给出以下输出:
要查看上述公式的工作原理,请考虑以下查询:
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;
它将给出以下输出:
热门文章
优秀文章