不用limit实现

查找入职员工时间排名倒数第三的员工所有信息

http://www.nowcoder.com/questionTerminal/ec1ca44c62c14ceb990c3c40def1ec6c

select * 
from employees
where  hire_date=
(select min(a.hire_date) 
from employees a,employees b
where a.emp_no!=b.emp_no and a.hire_date<b.hire_date
group by a.emp_no
having count(*)<3)
全部评论
我试着解释一下。自连接后可以主要看作四个字段aid、bid、adate、bdate.非等值连接保证了有序对《1,3》和《3,1》只能取《1,3》。分组之后,对某个员工E来说,假如他的adate是2000,它的bdate可能有很多对如1999、 1989...加了having限制后,如果员工E对应的b多余3就直接被过滤了。count(*)<3意味着比E入职晚的员工少于3(E可能是倒数第1~3),但是有入职越晚date越大,date值又是一个确定的数(即使同一时间内多个人入职),将所有的组的adate取min之后得到的一定是倒数第三个(取值范围-3~-1,date越大值越大)
2 回复 分享
发布于 2020-11-19 20:54
子查询得到的是指定的某个员工晚入职的人数少于三,得到结果例如 A>B>C,再取min(hire_date)就得到A.
1 回复 分享
发布于 2021-04-22 10:19
为什么不直接取 count(*)=2 ,子查询 直接返回 a.hire_date,如下: select * from employees where hire_date= (select a.hire_date from employees a,employees b where a.emp_no!=b.emp_no and a.hire_date < b.hire_date group by a.emp_no having count(*)=2)
1 回复 分享
发布于 2021-12-15 00:52
错误,min函数在group by之后,having之前运行,这里的having没办法实现控制排名的效果。
1 回复 分享
发布于 2022-02-23 23:01
你这个不能通过啊
6 回复 分享
发布于 2021-04-18 23:19
不知道为啥之前的评论都说牛。虽然答主的想法很有趣,不过我发现了一些问题。 1,min聚集函数在having之前就执行了,理想中是having在min之前执行才正确。 2,having中无论是"<3"或"=2",都是只考虑了倒数第一和第二的日期只有一个,如果有多个根本不行。
4 回复 分享
发布于 2021-12-22 18:58
我对这种做法也比较感兴趣,我推了一下,假设最大日期1个,第二大日期2个,第三大日期2个,根据你所说的连接,HAVING COUNT(*) < 3,直接将入职日期第三位的数据删除了。
3 回复 分享
发布于 2021-05-23 17:22
真牛
1 回复 分享
发布于 2020-08-11 09:07
绝了
1 回复 分享
发布于 2021-02-04 18:45
好奇这个运行速度有limit的那种快吗
1 回复 分享
发布于 2022-09-07 19:40 江苏
子查询看不懂。。可以解释一哈嘛
点赞 回复 分享
发布于 2020-10-19 15:13
select * from employees where hire_date= (select min(a.hire_date) from employees a,employees b where a.emp_no!=b.emp_no and a.hire_date
点赞 回复 分享
发布于 2021-04-03 17:21
点赞 回复 分享
发布于 2021-05-07 21:22
真厉害!
点赞 回复 分享
发布于 2021-05-21 10:28
我的报错 ERROR 1242 (21000): Subquery returns more than 1 row select min(a.hire_date) from employees a,employees b where a.emp_no!=b.emp_no and a.hire_date
点赞 回复 分享
发布于 2021-07-18 13:17
错了,子查询只能返回一条结果
点赞 回复 分享
发布于 2021-07-27 15:15
我还是不太明白。 在我的表里有个字段date,经过order by排序之后里面的四个值分别是A、B1、B2、B3,且B1=B2=B3。 根据大佬的语句查询会报错: 子查询只能返回一个结果。我改“=”为“in”之后,查到的结果是B1、B2、B3。。。
点赞 回复 分享
发布于 2021-09-23 15:44
报错,子查询只能返回一条结果
点赞 回复 分享
发布于 2021-12-02 07:45
刚学习SQL;直接用大牛的mysql 和 sqlite都没通过。在启发下写了这个: select * from employees where hire_date in ( select h1 from ( (select distinct hire_date h1 from employees) a join (select distinct hire_date h2 from employees) b )t where h1 < h2 group by h1 having count(*) = 2) 测试已过。 但可能仍有应优化之处,欢迎大家讨论。
点赞 回复 分享
发布于 2021-12-23 11:58
您这个好像有一点问题 例如: a 1 2 3 4 5 6 b 1 2 3 4 5 6 我们假设现在employees表里有六条数据,每条数据的进场时间如我们上述数字表示,1代表第一个入场,2代表第二个,左侧一列代表a表,右面一侧代表b表。a.emp.no!=b.emp.no,说明他们每一组都有除本身以外的五个连接例如1有2,3,4,5,6五种,2有1,3,4,5,6五种。a.hire_date
点赞 回复 分享
发布于 2022-01-25 16:03

相关推荐

59 26 评论
分享
牛客网
牛客企业服务