SQL - Greatest-n-per-group of average
SQL - Greatest-n-per-group of the average
我在处理以下查询时遇到问题。假设您有以下 table 名员工:
示例 table EMPLOYEE
:
IDEMP | JOB | SALARY | CONTENT
------+-----------+--------+---------
1 | CLERK | 1500 | ...
2 | CLERK | 1000 | ...
3 | PRESIDENT | 5000 | ...
4 | ANALYST | 2000 | ...
... ... ... ...
我正在尝试获得平均工资最高的工作。我可以使用这个子查询轻松获得每个 JOB 的平均工资:
(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,但是当您执行 'average subquery' 时,您会丢失员工的 ID。
因为对于这个给定的例子只有一位总统,而且这份工作的平均工资最高,输出应该是这样的:
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)
您可以尝试以下 - 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
按平均值降序对您的查询进行排序并选择第一行:
select job, avg(salary) as AVERAGE
from EMPLOYEE
group by job
order by AVERAGE desc limit 1
参见demo。
我找到了一个查询 return 我想要的结果,而且比以前发布的查询更灵活,因为如果是这样的话,它可以 return 多行:
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)
我在处理以下查询时遇到问题。假设您有以下 table 名员工:
示例 table EMPLOYEE
:
IDEMP | JOB | SALARY | CONTENT
------+-----------+--------+---------
1 | CLERK | 1500 | ...
2 | CLERK | 1000 | ...
3 | PRESIDENT | 5000 | ...
4 | ANALYST | 2000 | ...
... ... ... ...
我正在尝试获得平均工资最高的工作。我可以使用这个子查询轻松获得每个 JOB 的平均工资:
(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,但是当您执行 'average subquery' 时,您会丢失员工的 ID。
因为对于这个给定的例子只有一位总统,而且这份工作的平均工资最高,输出应该是这样的:
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)
您可以尝试以下 - 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
按平均值降序对您的查询进行排序并选择第一行:
select job, avg(salary) as AVERAGE
from EMPLOYEE
group by job
order by AVERAGE desc limit 1
参见demo。
我找到了一个查询 return 我想要的结果,而且比以前发布的查询更灵活,因为如果是这样的话,它可以 return 多行:
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)