SQL中的嵌套聚合函数,Max(Avg())。

9
我正在使用SQL编写以下查询:
select MAX(AVG(salary) ) from employees group by department_id;

首先我将通过 department_id 获取组,但接下来会发生什么?


你是否遇到了错误或意外的结果? - StingyJack
2
它会失败。您不能嵌套聚合函数,必须将内部函数放在子查询中。 - Michael Berkowski
这在SQLFiddle.com上可测试的4个RDBMS中都是无效的。http://sqlfiddle.com/#!6/7a123/2 - Michael Berkowski
我收回之前的话 - Oracle 允许这样做。http://sqlfiddle.com/#!4/7a123/2 - Michael Berkowski
@StingyJack 不,我没有收到错误,但我不理解它的结果是如何得出的。 - Ala Aga
是的,@MichaelBerkowski,Oracle允许它。 - Ala Aga
4个回答

18

如果你有类似这样的东西

EmployeeId DepartmentId Salary
    1          1         10              
    2          1         30
    3          2         30
    4          2         40
    5          2         20
    6          3         40
    7          3         50

分组后

DepartmentId    AVG(Salary) 
    1             (10+30)/2 = 20
    2             (30+40+20)/3 = 30
    3             (40+50)/2= 45

因此,下面的查询将返回部门编号为3的最大平均工资为45。

SELECT MAX(x.avg) 
FROM ( SELECT AVG(salary)as avg FROM employees group by department_id)x;

我不相信这在每个关系型数据库管理系统中都是真的。@nikola-mitev哪个RDMBS使您能够组合两个聚合? - lkegel
1
Oracle可以做到这一点。http://sqlfiddle.com/#!6/7a123/2 我们可以有嵌套的聚合。 - Chandan Bhattad

6
很可能,根据您的关系型数据库,这需要使用子查询来完成。
select max(AveragesByDept.avgSalary) 
from ( 
    select avgSalary=avg(salary) 
    from employees
    group by department_id
    ) AveragesByDept

为什么你要按EmployeeID进行分组?这会得到完全不同的结果。应该按DepartmentId进行分组... - Nitin Midha
@NitinMidha 绝对正确。department_id 是正确的。是我的错误。 - Brad
只需要注意,需要子查询是依赖于关系型数据库管理系统的。 - David Aldridge
这个结尾的 M 是什么意思? - h8red
@h8red,M是整个子查询表达式的别名。我可以重写得更明确一些。 - Brad

2
你可以通过获取一行数据来实现这个目标。例如:
select AVG(salary)
from employees
group by department_id
order by avg(salary) desc
limit 1
< p > limit 1 可能是 top 1 (SQL Server) 或带有 rownum = 1 的子查询 (Oracle)。


1
不需要子查询,+1 聪明。 - juergen d
除了 Oracle 12c 之前的版本,需要使用子查询和 rownum <= 1 谓词。:( - David Aldridge

1

这取决于关系型数据库管理系统的支持情况,但如果支持,您将获得部门平均工资中最高的。

group by 应用于内部聚合,而外部聚合未分组。


我不知道有哪个关系型数据库实际上支持这个... - Michael Berkowski
最终我会得到一个数字还是表格?谢谢。 - Ala Aga
1
根据ANSI标准,即使表为空,投影(projection)只返回聚合函数的一个单行和一个单列,因为它只能返回一个单行。Oracle支持此功能:http://sqlfiddle.com/#!4/aeff1/3 - David Aldridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接