SQL:如何获取AVG(MIN(数字))?

时间:2012-11-16 18:40:05

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

我正在寻找 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

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

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

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

我的真实数据有几百行,所以它并不是非常大。但我无法弄清楚如何在一个简单的声明中做到这一点。谢谢你的帮助。

4 个答案:

答案 0 :(得分:3)

试试这个:

;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

答案 1 :(得分:2)

选择最小值集非常简单。 cast()对于avoid integer division以后是必要的。你也可以通过强制转换为float而不是decimal来避免整数除法。 (但你应该知道浮点数是“有用的近似值”。)

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)使用最小值作为派生表

答案 2 :(得分:1)

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

-- 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

答案 3 :(得分:-1)

我认为最简单的就是

for max

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

平均

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