【问题标题】:write a sql query for below condition? [duplicate]为以下条件编写一个 sql 查询? [复制]
【发布时间】:2023-04-10 05:49:01
【问题描述】:

找出第二多的没有。使用 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 排名第二。

【问题讨论】:

    标签: oracle


    【解决方案1】:

    首先使用分组统计每个部门的员工数量,然后使用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() 函数更改您的解决方案,以选择任意部门,即使第二个位置有关系。

    【讨论】:

    • 但是这里只显示 dname 但我想要 dname 的总数。员工
    • 添加 cnt 列,一切就在那里。
    • union vs union all 提供更多性能以及为什么>
    • 如果对您有帮助,请接受答案,方法如下:meta.stackexchange.com/questions/5234/…
    • UNION 和 UNION ALL 的区别网上有很好的描述
    猜你喜欢
    • 2022-06-14
    • 2021-05-01
    • 2014-03-18
    • 2021-02-14
    • 2018-09-10
    • 2021-07-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    相关资源
    最近更新 更多