zoukankan      html  css  js  c++  java
  • SQL 分组内取前几名的问题

    查找 部门工资前三高的所有员工

    比如这题,找每个部门的工资前三名,那么先在子查询中用Employee和自己做连接,
    连接条件是【部门相同但是工资比我高】,那么接下来按照having count(Salary) <= 2
    来筛选的原理是:如果【跟我一个部门而且工资比我高的人数】不超过2个,那么我一定是部门工资前三,
    这样内层查询可以查询出所有符合要求的员工ID,接下来外层查询就简单了。```
    
    
    # 内层查询,找前三高工资员工
    select e1.Id
    from Employee e1 left join Employee e2
    # 和我(e1)在同一部门的
    on e1.DepartmentId=e2.DepartmentId
    # 且工资比我高的
    and e1.Salary<e2.Salary
    # 不超过2个
    group by Id
    having count(distinct e2.Salary)<=2
    
    # 外层查询
    select d.Name as Department,e.Name as Employee,e.Salary as Salary
    from Employee e left join Department d
    on  e.DepartmentId=d.Id
    where e.Id in (
        "内层Id 结果集"
        )
        and e.DepartmentId in(
            select Id
            from Department
        )
    order by d.Id asc,e.Salary desc
    
    # 外层查询
    select d.Name as Department,e.Name as Employee,e.Salary as Salary
    from Employee e left join Department d
    on  e.DepartmentId=d.Id
    
    where e.Id in (
        # 内层查询,找前三高工资员工
    select e1.Id
    from Employee e1 left join Employee e2
    # 和我(e1)在同一部门的
    on e1.DepartmentId=e2.DepartmentId
    # 且工资比我高的
    and e1.Salary<e2.Salary
    # 不超过2个
    group by Id
    having count(distinct e2.Salary)<=2
        )
        and e.DepartmentId in(
            select Id
            from Department
        )
    order by d.Id asc,e.Salary desc
    
  • 相关阅读:
    项目中对axios进行二次封装
    vue对象数组数据变化,页面不渲染
    深拷贝和浅拷贝
    你说的都队-凡事预则立
    你说的都队——项目系统设计与数据库设计
    2020软件工程作业——团队04
    2020软件工程作业——团队03
    2020软件工程作业——团队02
    你说的都队——团队展示
    TCP协议
  • 原文地址:https://www.cnblogs.com/alidata/p/13528255.html
Copyright © 2011-2022 走看看