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 ...
)
select
dname,
ename,
salary,
row_number() over(partition by dname order by salary desc) as rn
from employee;
row_number() :直接排序,将那些数值相同也按照顺序排序
select
dname,
ename,
salary,
rank() over(partition by dname order by salary desc) as rn
from employee;
rank():相同的并列排序,将一样的数值放在了一起,也就是并列排名
-- 对每个部门的员工按照薪资排序,并给出排名 dense-rank
select
dname,
ename,
salary,
dense_rank() over(partition by dname order by salary desc) as rn
from employee;
dense_rank():连续并列的排序,想并列排名,不想中间空排名次序,即连续的排名
--求出每个部门薪资排在前三名的员工- 分组求TOPN
select
*
from
(select dname,ename,salary,dense_rank() over(partition by dname order by salary desc) as rnfrom employee
)t
where t.rn <= 3