计算机小白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但是这种方法是有局限性的也就是说是不对的,因为这样没有考虑最多人数并列时候的情况,只输出一个是与实际情况不同的。