SQL - Greatest-n-per-group of average

Posted

技术标签:

【中文标题】SQL - Greatest-n-per-group of average【英文标题】:SQL - Greatest-n-per-group of the average 【发布时间】:2021-02-14 10:33:53 【问题描述】:

以下查询有问题。假设您有以下员工表:

示例表EMPLOYEE

IDEMP |    JOB    | SALARY | CONTENT 
------+-----------+--------+---------
  1   |   CLERK   |  1500  |   ...   
  2   |   CLERK   |  1000  |   ...   
  3   | PRESIDENT |  5000  |   ...   
  4   |  ANALYST  |  2000  |   ...   
  ...       ...       ...      ...

我正在努力获得平均工资最高的工作。我可以通过这个子查询轻松获得每个工作的平均工资:

(select job, avg(salary) as AVERAGE 
 from emp
 group by job) temp

但是,我不知道如何在此子查询之后获得具有关联 JOB 的 max(AVERAGE)。我知道,如果我只需要薪水最高的员工所在的行,我可以按照此处SQL select only rows with max value on a column 的说明进行操作,但是当您执行“平均子查询”时,您会丢失员工的 ID。

由于对于这个给定的示例,只有一位 PRESIDENT,并且该职位的平均工资最高,因此输出应该是这样的:

   JOB    |  MAX_AVERAGE 
----------+---------------
PRESIDENT |     5000     

编辑:我的解决方案...

感谢您的帮助,您提出了新的想法。我终于使用了这个,因为它不会将结果限制在一行。

select e.job, avg(e.salary) as AVERAGE 
 from EMPLOYEE e
 group by e.job
 having avg(e.salary) >= ALL(select avg(salary) from EMPLOYEE group by job)

【问题讨论】:

用您使用的数据库标记您的问题。 如果两个工作的最高平均工资相同怎么办? 【参考方案1】:

你可以试试下面的 - DEMO

with cte as
(
select job,avg(salary) avg_sal
from t1 group by job
)
select * from
(
select job,avg_sal, row_number() over(order by avg_sal desc) as rn
from cte
)A where rn=1

【讨论】:

我还以为我懂 SQL,该死的【参考方案2】:

按平均降序对查询进行排序并选择最上面的一行:

select job, avg(salary) as AVERAGE 
 from EMPLOYEE
 group by job
 order by AVERAGE desc limit 1

请参阅demo。

【讨论】:

这其实很简单也很聪明,我想我没有那么多经验去想这个!【参考方案3】:

我找到了一个查询,它可以返回我想要的结果,并且比以前发布的更灵活,因为如果是这种情况,它可以返回多行:

select e.job, avg(e.salary) as AVERAGE 
 from EMPLOYEE e
 group by e.job
 having avg(e.salary) >= ALL(select avg(salary) from EMPLOYEE group by job)

【讨论】:

以上是关于SQL - Greatest-n-per-group of average的主要内容,如果未能解决你的问题,请参考以下文章

sql [sql技巧]一些sql技巧#sql

sql 2008 r2 在sql 2008上兼容么

SQL基础

有大神知道,sql server 中如何批量执行sql语句吗?

pl sql developer怎么执行sql

pl sql developer怎么执行sql