代码之家  ›  专栏  ›  技术社区  ›  JC97

SQL平均最小值

  •  0
  • JC97  · 技术社区  · 7 年前

    对于查询,我需要选择“平均值最小”的记录。所以理论上我应该

    select min(avg(x)) from tableA;
    

    由于不支持嵌套聚合函数,我不确定如何实现这一点。我也试过subquery,但我从来没能成功,所以有人想好了吗?伪代码就足够了,我不需要完整的解决方案。这就是为什么我自己使用了伪代码而没有给出我正在处理的数据。

    提前谢谢!

    编辑: 因为需要给出示例/sampledata:

    我有3张表,我需要从中获取零件、员工和工期。 我需要查询按part&employee分组,并需要获得最小的持续时间平均值。

    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 回复  |  直到 7 年前
        1
  •  1
  •   Zaynul Abadin Tuhin    7 年前

    您可以使用子查询,然后使用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
    
        2
  •  1
  •   Gordon Linoff    7 年前

    平均值的最小值是没有意义的,除非你是通过某种东西聚合起来的。我希望是这样的:

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