【问题标题】:SQL: How to get the AVG(MIN(number))?SQL:如何获得 AVG(MIN(number))?
【发布时间】:2012-11-05 12:37:00
【问题描述】:

我正在寻找 MINIMUM 数字(按人分组)的 AVERAGE总体)。

我的桌子是这样的:

Rank    Name
1   Amy
2   Amy
3   Amy
2   Bart
1   Charlie
2   David
5   David
1   Ed
2   Frank
4   Frank
5   Frank

我想知道最低分数的平均数。对于这些人来说,得分最低的是:

Rank    Name
1   Amy
2   Bart
1   Charlie
2   David
1   Ed
2   Frank

给我一​​个 1.5 的最终答案 - 因为三个人的 MIN(Rank) 为 1,而其他三个人的 MIN(Rank) 为 2。这就是我要找的——一个数字。

我的真实数据有几百行,所以不是很大。但我无法在一个简单的语句中弄清楚如何做到这一点。感谢您的帮助。

【问题讨论】:

    标签: sql sql-server sql-server-2008 aggregate-functions


    【解决方案1】:

    我认为最简单的是

    最大

    select name , max_rank = max(rank) 
    from table
    group by name;
    

    平均

    select name , avg_rank = avg(rank)
    from table
    cgroup by name;
    

    【讨论】:

      【解决方案2】:

      试试这个:

      ;WITH MinScores
      AS
      (
         SELECT 
           "Rank", 
           Name, 
           ROW_NUMBER() OVER(PARTITION BY Name ORDER BY "Rank") row_num
        FROM Table1
      ) 
      SELECT 
        CAST(SUM("Rank") AS DECIMAL(10, 2)) / 
        COUNT("Rank")
      FROM MinScores 
      WHERE row_num = 1;
      

      SQL Fiddle Demo

      【讨论】:

      • PS:更新:我从您的最终部门中删除了两个“DISTINCT”。除此之外,完美。再次感谢您!
      【解决方案3】:

      选择一组最小值很简单。 cast() 是以后avoid integer division 所必需的。您还可以通过转换为浮点数而不是十进制数来避免整数除法。 (但你应该知道浮点数是“有用的近似值”。)

      select name, cast(min(rank) as decimal) as min_rank
      from Table1
      group by name
      

      现在您可以使用最小值作为公用表表达式,并从中进行选择。

      with minimums as (
        select name, cast(min(rank) as decimal) as min_rank
        from Table1
        group by name
      )
      select avg(min_rank) avg_min_rank
      from minimums
      

      如果您碰巧需要在不支持公用表表达式的平台上执行相同的操作,您可以 a) 创建最小值视图,然后从该视图中进行选择,或者 b) 将最小值用作派生值表。

      【讨论】:

      • 啊,这也可以完美运行,但稍微简单一些。也非常感谢。
      【解决方案4】:

      您可以尝试使用派生表来获取最小值,然后在外部查询中获取平均最小值,如下所示:

      -- Get the avg min rank as a decimal
      select avg(MinRank * 1.0) as AvgRank
      from (
          -- Get everyone's min rank
          select min([Rank]) as MinRank
          from MyTable
          group by Name
      ) as a
      

      【讨论】:

        猜你喜欢
        • 2018-04-02
        • 2018-06-06
        • 1970-01-01
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-04
        相关资源
        最近更新 更多