首页 > 解决方案 > 我尝试通过以下查询找到平均工资

问题描述

我需要找到谁的收入高于他们自己公司的平均工资,但如果某家公司有不止一名员工(收入超过他们自己公司的平均工资),那么我需要从中选择最高的一个

select w.*
from (select w.*, avg(salary) over (partition by company_name) as avgsalary
      from works w
      ) w
where w.salary >w.avgsalary;

结果:-

-----------------------------------------------------
Emp_Name| company_name          |salary  |avgsalary   
--------|-----------------------|--------|-----------
emp 11   D Bank Corporation  39000   36800
emp 8    First Bank Corporation  40000   36280
emp 15   Nation Bank Corporation 42000   36800
emp 9    Small Bank Corporation  38900   37620
emp 5    Small Bank Corporation  39200   37620
emp 2    Small Bank Corporation  38000   37620

但我需要结果为:

-----------------------------------------------------
Emp_Name| company_name          |salary  |avgsalary   
--------|-----------------------|--------|-----------
emp 11   D Bank Corporation  39000   36800
emp 8    First Bank Corporation  40000   36280
emp 15   Nation Bank Corporation 42000   36800
emp 5    Small Bank Corporation  39200   37620

emp 5的薪水大于 emp 9 和 2。所以这就是为什么第一个结果不被接受。请帮我通过我的查询找到第二个结果

标签: sql

解决方案


我会ROW_NUMBER在这里添加到组合中:

select w.*
from (
    select w.*, avg(salary) over (partition by company_name) as avgsalary,
        row_number() over (partition by company_name order by salary desc) rn
    from works w
) w
where
    salary > avgsalary and
    rn = 1;

上述查询与原始查询的逻辑区别在于,现在如果有两名或多名员工的薪水超过平均水平,则只会返回薪水最高的员工。对于两个高于平均水平的工资关系的额外边缘情况,您应该指定有关如何打破该关系的附加逻辑(或者,您可以将ROW_NUMBER上面替换为RANK,并返回它们)。


推荐阅读