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

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

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

  • 0
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值