Leetcode-Mysql题目及知识点总结(1076.项目员工II)

计算机小白QAQ,因为想找数分岗暑期实习所以充了会员想集中刷一下leetcode的mysql部分。写这个系列博文和大家们交流一下,后面也会持续更新面经准备的一些问题,欢迎同好们一起交流,求大佬轻喷QAQ。因为自己初学也走了很多弯路,所以会尽量写得详细一点,如果可以帮助到后来的朋友们,请各位留言鼓励一下哈哈哈哈。

1076.项目员工II

这道题比较难,我一共大概有三个思路和大家交流。

思路1:首先构造出一个表得到各个项目与该项目人员数的统计,然后找出最多人员数与该表比对得到人数最多的项目。

知识点:用到子查询、group by分组计数count、order by排序、desc关键字,limit限制输出。

代码:

select project_id

from(select project_id,count(*)as num

from project 

group by project_id)ts

where num =(select count(*)as num

from project 

group by project_id

order by num desc

limit 1)

 

思路2:雇员最多的项目那就是雇员数大于其他所有项目雇员数的项目,所以要分组计数,然后保证计数结果count大于其他所有的项目员工计数即可,也就是筛选出项目员工数大于等于所有项目员工数的项目即可。

知识点:新涉及到的知识点主要是all函数,表示所有,用于筛选所有项目员工计数中最大的数字。

select project_id

from project 

group by project_id 

having count(*)>=all(select count(*)from project group by project_id)

 

思路3:将各项目按照人数排序,找到排在第一位的项目。

知识点:窗口函数rank、dense_rank和row_number总结,这三个都是用于排序的窗口函数,在sql中具有极为常见,同时三者区别也是各个公司面试时常考的问答题之一,现在我和大家距离说明一下具体的区别,如果有三个数字进行排序分别是100,100,90.rank排序后的结果为1,1,3.dense_rank排序后的结果为1,1,2。row_number排序后的结果为1,2,3。也就是说rank和dense_rank会把相同的数字并列排序,但是row_number只是没有感情的按顺序往下排列,另一方面rank是显示并列结果的就想高考排位,前面有1000人同分那我就排1001,而dense_rank是不显示并列结果的。格式以rank为例,rank()over(order by 按什么排序 partition by 按什么分组)这三个函数均可实现分组排序,不写partition by 的话默认整个表。

select project_id

from

(select project_id,rank()over(order by count(distinct employee_id)desc)as num

from Project

group by project_id)te

where num=1

注意:其实这道题rank并不是非常合适,如果是选择第二高的dense_rank相比而言要更加符合条件因为是只考虑人数排名。

注意!!我相信这道题大家在一开始的想法都是直接order by+limit 1但是这种方法是有局限性的也就是说是不对的,因为这样没有考虑最多人数并列时候的情况,只输出一个是与实际情况不同的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值