SQL平均值的最小值

时间:2018-08-07 12:01:47

标签: sql sql-server aggregate-functions

对于查询,我需要选择“平均值最小”的记录。因此,从理论上讲,我应该做类似

的操作
select min(avg(x)) from tableA;

由于不支持嵌套聚合函数,因此我不确定如何实现此目的。我尝试使用子查询作为wel,但是我永远无法使其工作,所以有人有想法吗?伪代码就足够了,我不需要完整的解决方案。这就是为什么我自己使用伪代码而不提供正在处理的数据的原因。

谢谢!

编辑: 由于需要提供示例/ sampledata:

我有3个表,需要从中获取零件,员工和工期。 我需要将查询按零件和员工进行分组,并且需要获取持续时间的最小值。

SELECT p.part, e.Name, min(avg(s.duration)) as AvgDuration
FROM store s
JOIN parts p
ON p.PartId = s.PartId
JOIN employees e
ON e.EmployeeId = s.EmployeeId
GROUP BY p.PartNr, e.Name
ORDER BY PartNr;

我知道这是一个错误的查询,但是应该清楚我的目标。

基于戈登的解决方案,

我有以下查询:

SELECT m.PartNr, m.Name, min(avg_duration) as Duration
FROM (
    SELECT p.PartNr, e.Name, avg(s.Duration) as avg_duration
    FROM Store s
    JOIN parts p
    ON p.PartId = s.PartId
    JOIN employees e
    ON e.EmployeeId = s.EmployeeId
    GROUP BY p.PartNr, e.Name
) m
GROUP BY m.PartNr, m.Name;

但这是为每个员工提供最小的平均值,而只显示最小的员工。

2 个答案:

答案 0 :(得分:1)

平均值的最小值没有意义,除非您正在汇总某些内容。我期望像这样:

select min(avg_x)
from (select avg(x) as avg_x
      from t
      group by ?
     ) x;

答案 1 :(得分:1)

您可以通过使用子查询然后使用min函数来完成它。从讨论中我发现了问题,并在查询下面找到了它

select t2.PartNr,t3.Name,Prt_minDuration from 
(
select m.PartNr,min(Duration) as Prt_minDuration from
(
SELECT m.PartNr, m.Name, min(avg_duration) as Duration
FROM (
    SELECT p.PartNr, e.Name, avg(s.Duration) as avg_duration
    FROM Store s
    JOIN parts p
    ON p.PartId = s.PartId
    JOIN employees e
    ON e.EmployeeId = s.EmployeeId
    GROUP BY p.PartNr, e.Name
) m
GROUP BY m.PartNr, m.Name
) t1 group by PartNr
) t2

inner join 
(
SELECT m.PartNr, m.Name, min(avg_duration) as Duration
FROM (
    SELECT p.PartNr, e.Name, avg(s.Duration) as avg_duration
    FROM Store s
    JOIN parts p
    ON p.PartId = s.PartId
    JOIN employees e
    ON e.EmployeeId = s.EmployeeId
    GROUP BY p.PartNr, e.Name
) m
GROUP BY m.PartNr, m.Name
) t3 on t2.PartNr=t3.PartNr and t2.Prt_minDuration=t3.Duration