MySQL窗门函教-序号函数(row_number、rank、dense_rank)
前言
mysql8.0中新增窗口函数(开窗函数)
窗口函数和普通聚合函数的区别
①聚合函数是将多条记录聚合为一条;窗口函数是每条记录都会执行,有几条记录执行完还是几条。
②聚合函数也可以用于窗口函数。
窗口函数分类
另外还有开窗聚合函数: SUM,AVG,MIN,MAX
语法格式
window_function ( expr ) OVER (
PARTITION BY ...
ORDER BY ...
frame_clause
)
window_function:是窗口函数名称
expr:有些函数没有参数
PARTITION BY:根据什么分组,类似group by
ORDER BY:根据什么排序
序号函数
row_number()|rank()|dense_rank() over (
partition by ...
order by ...
)
示例1 ROW_NUMBER()
select
dname,
ename,
salary,
row_number() over(partition by dname order by salary desc) as rn
from employee;
效果
row_number() :直接排序,将那些数值相同也按照顺序排序
示例2 rank()
select
dname,
ename,
salary,
rank() over(partition by dname order by salary desc) as rn
from employee;
效果
rank():相同的并列排序,将一样的数值放在了一起,也就是并列排名
示例3 dense_rannk()
-- 对每个部门的员工按照薪资排序,并给出排名 dense-rank
select
dname,
ename,
salary,
dense_rank() over(partition by dname order by salary desc) as rn
from employee;
效果
dense_rank():连续并列的排序,想并列排名,不想中间空排名次序,即连续的排名
例题
取出排名前三的数据(Top N),实现取出用户的前三个值
--求出每个部门薪资排在前三名的员工- 分组求TOPN
select
*
from
(
select
dname,
ename,
salary,
dense_rank() over(partition by dname order by salary desc) as rn
from employee
)t
where t.rn <= 3