MySQL開窗函式
知識點
三種開窗函式:row_number(),rank(),dense_rank() 這三種函式都是用于回傳結果集的分組內每行的排名
區別:
row_number():特點是唯一且連續,如果四個人是按成績排名,那么是1234這樣排的,即使有重分的人
rank(): 特點是并列不連續,如果四個人是按成績排名,那么是1224這樣排的,重分的人是同一個排名,且占一個排名的位置,排名不連續
dense_rank():特點是并列且連續,如果四個人是按成績排名,那么是1223這樣排的,重分的人是同一個排名,共占一個排名,排名連續
示例
# 三種排序函式: row_number() rank() dense_rank()
# 資料準備
create table employee (
empid int,ename varchar(20) ,deptid varchar(10) ,salary decimal(10,2)
);
insert into employee values(1,'劉備','蜀',5500.00);
insert into employee values(2,'趙云','蜀',4500.00);
insert into employee values(3,'張飛','蜀',3500.00);
insert into employee values(4,'關羽','蜀',4500.00);
insert into employee values(5,'曹操','魏',1900.00);
insert into employee values(6,'許褚','魏',4800.00);
insert into employee values(7,'張遼','魏',6500.00);
insert into employee values(8,'徐晃','魏',14500.00);
insert into employee values(9,'孫權','吳',44500.00);
insert into employee values(10,'周瑜','吳',6500.00);
insert into employee values(11,'陸遜','吳',7500.00);
# 需求一: 使用三種排序函式對employee表中員工按照薪資進行降序排名:
select *,row_number() over (order by salary desc) as rank1,rank() over (order by salary desc)as rank2,dense_rank() over (order by salary desc)as rank3 from employee;
# 需求二: 對employee表中按照deptid進行分組,并對每一組的員工按照薪資進行降序排名:
select *,row_number() over (partition by deptid order by salary desc) as rank1,rank() over (partition by deptid order by salary desc)as rank2,dense_rank() over (partition by deptid order by salary desc)as rank3 from employee;
#開窗函式經常用于解決TOP N問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/552398.html
標籤:MySQL
上一篇:MySQL-簡單總結
下一篇:返回列表