MySQL窗口函教-序号函数(row_number、rank、dense_rank)

MySQL窗门函教-序号函数(row_number、rank、dense_rank)

前言

mysql8.0中新增窗口函数(开窗函数)

窗口函数和普通聚合函数的区别

        ①聚合函数是将多条记录聚合为一条;窗口函数是每条记录都会执行,有几条记录执行完还是几条。

        ②聚合函数也可以用于窗口函数。

MySQL窗口函教-序号函数(row_number、rank、dense_rank)_第1张图片

 窗口函数分类

MySQL窗口函教-序号函数(row_number、rank、dense_rank)_第2张图片

 另外还有开窗聚合函数: 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;

效果

MySQL窗口函教-序号函数(row_number、rank、dense_rank)_第3张图片

 row_number() :直接排序,将那些数值相同也按照顺序排序

示例2 rank()

select 
dname,
ename,
salary,
rank() over(partition by dname order by salary desc) as rn 
from employee;

效果

MySQL窗口函教-序号函数(row_number、rank、dense_rank)_第4张图片

 rank():相同的并列排序,将一样的数值放在了一起,也就是并列排名

示例3 dense_rannk()

-- 对每个部门的员工按照薪资排序,并给出排名 dense-rank
select 
dname,
ename,
salary,
dense_rank() over(partition by dname order by salary desc) as rn 
from employee;

效果

MySQL窗口函教-序号函数(row_number、rank、dense_rank)_第5张图片

 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

MySQL窗口函教-序号函数(row_number、rank、dense_rank)_第6张图片

 我们在写SQL的时候partition by关键词可以不加,直接省略,表示全局排序,全局作为一组进行排序

你可能感兴趣的:(mysql数据库,mysql,数据库,java,开发语言,oracle)