图解SQL语句:分组查询TOP N

本文介绍了如何使用SQL解决力扣184题和185题。184题要求找出每个部门工资最高的员工信息,通过部门分组并取最大薪资,再用子查询匹配员工信息。185题则需要找出每个部门工资前三名的员工,利用窗口函数dense_rank()进行部门内薪资排序,筛选出排名前三的员工。
摘要由CSDN通过智能技术生成

力扣184题 & 力扣185题

【题目】

184、部门工资最高的员工信息,name ,salary ,department_name

185、部门工资前三高的员工

        表emplyee:

id  namesalarydepartmentid
1joe70001
2jim85001
3henry80002
4sam60002
5max90001
6randy85001
7zhangsan80001

        表department

       

idname
1IT
2sales

【184题 解题思路】:部门工资最高的员工

1、部门工资最高;(分部门求最高值)按部门来划分,求每个部门中最高的薪水的员工信息,这其实就是分组,吧一个部门看成一个组。所以group by  部门;

SELECT
	departmentid,
	max( salary ) 
FROM
	emplyee 
GROUP BY
	departmentid;

这其实就是每个部门的最高薪水

2、求部门工资最高的员工信息;也就是查每个部门的每个员工的薪水在上面这条sql语句执行的结果中的。

比如:我it部门 薪水9000,那就说明我的薪水在这条sql执行的结果中的。子查询其实就是;部门+薪水  in  (上面的sql语句);

so,最后的sql语句


SELECT
	e.`name`,
	e.salary,
	d.`name` 
FROM
	emplyee AS e
	LEFT JOIN department AS d ON e.departmentid = d.id 
WHERE
	( departmentid, salary ) IN ( SELECT departmentid, max( salary ) FROM emplyee GROUP BY departmentid )

【185解题思路】:求每个部门工资前三名的员工信息;

1、每个部门工资前三的。(分部门求部门前三的值)说明要分组也要排序

先说排序,前三的,甭管并列的还是没有并列的,肯定都得有。所以窗口函数dense_rank()

select *,dense_rank() over(order by salary desc) from emplyee;

这肯定就是所有数据中薪水按倒序排列的。包括各个部门的。那这得到的结果跟我们想要的结果还是不一样。所以分组怎么搞??

     partition by 分组                 order by 排序

SELECT
	*,
	dense_rank ( ) over ( PARTITION BY departmentid ORDER BY salary DESC ) AS `rank` 
FROM
	emplyee;

2、每个部门薪水前三的员工信息。那就是求出所有满足上面sql语句的前三名就好了;

SELECT
	* 
FROM
	( SELECT *, dense_rank ( ) over ( PARTITION BY departmentid ORDER BY salary DESC ) AS `rank` FROM emplyee ) AS A 
WHERE
	`rank` <= 3;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值