第一部分:语法
rank()over(partition by column1,column2... order by column3,column4...)
其中:
1.column表示字段名
2.partition by 关键字表示根据后面的字段进行分区。
3.order by 关键字表示在partition by约定的分区下定义排名方式。
第二部分:实例
以下语句在以下环境均可以执行:sqlserver2014、oracle19c、mysql8.0.23。
工作中经常会遇到需要按多个字段组合进行排名的情况,sql提供了rank开窗函数很好的支持了该场景。
比如有以下示例数据
示例数据sql
CREATE TABLE t_rank
(
company varchar(10),
department varchar(10),
staff varchar(10),
salary decimal(10,2)
)
insert into t_rank values ('阿里巴巴','人事部','员工A1','5000');
insert into t_rank values ('阿里巴巴','人事部','员工B1','10000');
insert into t_rank values ('阿里巴巴','人事部','员工C1','11000');
insert into t_rank values ('阿里巴巴','人事部','员工D1','21000');
insert into t_rank values ('阿里巴巴','财务部','员工A2','5000');
insert into t_rank values ('阿里巴巴','财务部','员工B2','10000');
insert into t_rank values ('阿里巴巴','财务部','员工C2','11000');
insert into t_rank values ('阿里巴巴','财务部','员工D2','21000');
insert into t_rank values ('腾讯','人事部','员工A3','5000');
insert into t_rank values ('腾讯','人事部','员工B3','10000');
insert into t_rank values ('腾讯','人事部','员工C3','11000');
insert into t_rank values ('腾讯','人事部','员工D3','21000');
insert into t_rank values ('腾讯','财务部','员工A4','5000');
insert into t_rank values ('腾讯','财务部','员工B4','10000');
insert into t_rank values ('腾讯','财务部','员工C4','11000');
insert into t_rank values ('腾讯','财务部','员工D4','21000');
比如我们想知道公司每个部门薪资最高的员工,那么就可以用到rank开窗函数
查询sql如下
select
company,
department,
staff,
salary
from
(
select
company,
department,
staff,
salary,
rank()over(partition by company,department order by salary desc) as rk
from t_rank
)t
where rk = 1
查询结果如下
【推荐】FlashTable:表单开发界的极速跑车,让你的开发效率一路狂飙
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步