在我们SQL学习的过程中,经常分组然后求分组后的前几名或者是后几名是很经常见的,以前我们大概只会用limit做限制,然后疯狂的进行嵌套查询,才能勉强的将题做出来,如今我们学习了窗口函数,我们就可以较为优雅的将题解答出来,看题:
CREATE TABLE step(
pid INT,
NAME VARCHAR(20),
salary VARCHAR(20)
)
INSERT INTO step(pid,NAME,salary) VALUES(1,'波妞','3000'),(1,'小白','5000'),(1,'小明','3500'),(1,'波塞冬','3600'),(1,'冥王','4000')
,(2,'达令','1000'),(2,'昊天','6000'),(2,'海天','5000'),(2,'露水','3600')
,(3,'法尔','6000'),(3,'帆软','5000'),(3,'灵法','1500'),(3,'瑞芬','3900')
现在有一个需求,就是将每个部门中工资处于前三位的人员找出来,并显示它们的工资占这个部门的百分比
- 先将各部门人员按薪资水平排个序,
SELECT *,
ROW_NUMBER() OVER(PARTITION BY pid ORDER BY salary) AS rn,
FROM step
- 因为最后要求出每个人员占每个部门薪资的占比,所以我们应该让每个人都知道部门的总薪资,所以可以用到 sum() over()窗口函数去解决
SELECT *,
ROW_NUMBER() OVER(PARTITION BY pid ORDER BY salary) AS rn,
SUM(salary) OVER(PARTITION BY pid) AS sum_step
FROM step
- 在最后求出我们所需要的数据,对原始数据进行过滤
SELECT*,
--concat() 函数是拼接函数 round()函数是四舍五入函数,第二个参数是保留几位小数
CONCAT(ROUND(salary/sum_step*100,2),'%') AS rate
FROM
(SELECT *,
ROW_NUMBER() OVER(PARTITION BY pid ORDER BY salary) AS rn,
SUM(salary) OVER(PARTITION BY pid) AS sum_step
FROM step) AS t
WHERE rn<=3
一个模板碾压所有同类型问题:
select * from
(select zzz,
row_number() over(partition by 组名 xxx order by yyy) as rn
from table)as t
where rn<=N名
这次的类型专题已经结束,希望大家看完可以有所收货!!!