MySQL row_number()函数,rank()函数和dense_rank()函数

本文介绍了MySQL8.0中row_number(),rank(),dense_rank()三种窗口函数的区别,包括是否跳过相同值的排名。通过示例展示了如何在查询中使用这些函数为员工薪资进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从MySQL8.0开始引用row_number(), rank()函数和dense_rank()函数,也就是常见的窗口函数,三个函数都是一种用于计算排名的工具,它们根据指定的列对结果集进行排序,并为每一行分配一个排名值(1,2,3,...)。

函数区别点

1、row_number()函数不会跳过相同值排名,即常见顺序(1,2,3)

 适用场景:

  • 需要为每一行分配唯一的数字。
  • 不关心相同值的排名差异。

2、rank()函数会跳过相同值的排名,即使有相同的值也会分配相同的排名(1,1,3);

适用场景:

  • 需要考虑相同值的排名差异。
  • 希望在出现相同值时跳过下一级的排名。

3、dense_rank()函数不会跳过排名,即使有相同的值也会分配相同的排名(1,1,2);

适用场景:

  • 需要考虑相同值的排名差异。
  • 希望在出现相同值时不跳过下一级的排名。

函数语法

row_number()函数语法:

row_number() over (partition by expr,...[,expr_n]

                                order by expr [asc|desc],...[,expr_n]);

- partition by :可选部分,将结果集分成更小的集合,如果省略此部分,会将整个结果集视为一个分区。

- order by :必选部分,指定按照哪些列对行进行排序。

示例:为每个部门内的员工按照薪水排序

select department,employee_name,salary,
       row_number() over (partition by department order by salary) as '排名'
from employees;

rank()函数语法:

rank() over (order by column_name [asc|desc])

dense_rank函数语法:

dense_rank() over (order by column_name [asc|desc])

简单使用

假设有一个employee表,需要查询员工薪资排名

-- 使用row_number()函数
select name '姓名',salary '工资',row_number() over(order by salary desc) as '排名'
from `employees`;

-- rank()函数
select name '姓名',salary '工资',rank() over(order by salary desc) as '排名'
from `employees`;

-- dense_rank()函数
select name '姓名',salary '工资',dense_rank() over(order by salary desc) as '排名'
from `employees`;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值