为以下条件写一个SQL查询?

时间:2017-10-28 22:29:10

标签: oracle

找出第二多的没有。使用来自emp和dept表的dname的员工。

select d.dname,count(*) "totemp" from emp e,dept d
where e.deptno=d.deptno
group by (d.dname)
having count(*)=(select max(count(*)) from emp e,dept d 
where e.deptno=d.deptno
group by d.dname);

此查询将显示最高编号。使用dname的员工。 但我想要dname第二高。

1 个答案:

答案 0 :(得分:0)

首先使用分组来计算每个部门的员工,然后使用dense_rank()窗口函数为部门组分配等级值,最后选择排名第二的部门。

select dname
from (
  select dname, dense_rank() over (order by cnt desc) as rnk
  from (
    select d.dname, count(*) as cnt
    from emp e
    join dept d using (deptno)
    group by d.dname
  ) t
) x
where rnk = 2

使用dense_rank()功能可以正确解决问题,因此如果有多个具有相同员工数量的部署,则会全部弹出。

即使第二个位置有联系,您也可以使用row_number()功能更改解决方案以选择任意部门。