六种解法解决排名问题

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

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

关于排名的六种解法

#1、where标量子查询+distinct去重+limit分页查询

select * from employees
where hire_date = (
            select distinct hire_date from employees 
            order by hire_date desc
            limit 2,1
           );

#2、where标量子查询+group by去重合并+limit分页查询

select * from employees
where hire_date = (
             select hire_date 
             from employees 
             group by hire_date
             order by hire_date desc
             limit 2,1
           );

#3、开窗函数dense_rank()+from分页查询

  1. 窗口函数:<窗口函数> OVER ( [PARTITION BY <列清单> ] ORDER BY <排序用列清单> )      其中[ ]中的内容可以忽略,忽略后默认针对整个表
  2. 窗口函数之序列函数

序列函数将select查询到的分组数据进行排序

常见的3种序列函数:

row_number():唯一的连续排名       

例如,有3条排在第1位时,排序为:1,2,3,4······

rank():不唯一的不连续排名             例如,有3条排在第1位时,排序为:1,1,1,4······

dense_rank():不唯一的连续排名     

例如,有3条排在第1位时,排序为:1,1,1,2······

select 
t.emp_no
,t.birth_date
,t.first_name
,t.last_name
,t.gender
,t.hire_date
from (
     select 
     *
     ,dense_rank() over(order by hire_date desc) as `rank`
     from employees 
   ) t
where t.`rank` = 3;

#4、开窗函数dense_rank()+join

select a.*
from employees a
left join (
                select
                distinct emp_no
                ,dense_rank() over (order by hire_date desc) as `rank`
                from employees
            ) b
on a.emp_no=b.emp_no
where b.`rank`=3

#5、自连接比较+去重计数+where标量子查询

select *
from employees e3
where e3.hire_date = (
               select e1.hire_date                      -- 当e1<=e2链接并以e1.hire_date分组时一个e1会对应多个e2
               from employees e1
               join employees e2 on e1.hire_date <= e2.hire_date
               group by e1.hire_date
               having count(distinct e2.hire_date) = 3           -- 去重计数的结果即为hire_date的名次
            );

#6、自连接比较+去重计数+join

select e3.*
from employees e3
join
(
    select e1.hire_date                              -- 当e1<=e2链接并以e1.hire_date分组时一个e1会对应多个e2
    from employees e1
    join employees e2 on e1.hire_date <= e2.hire_date             
    group by e1.hire_date
    having count(distinct e2.hire_date) = 3                   -- 去重计数的结果即为hire_date的名次
) a
on e3.hire_date = a.hire_date;

全部评论
可以啊。
点赞 回复 分享
发布于 2022-09-17 23:38 上海
我想请问一下,为什么去重计数之后会是hire_date的名次啊
点赞 回复 分享
发布于 2024-03-25 12:30 北京

相关推荐

黑皮白袜臭脚体育生:简历统一按使用了什么技术实现了什么功能解决了什么问题或提升了什么性能指标来写会更好
点赞 评论 收藏
分享
风流倜傥从哥:这个项目确实太简单了有点,做点大项目。。。
点赞 评论 收藏
分享
评论
61
19
分享

创作者周榜

更多
牛客网
牛客企业服务