SQL:如何获取AVG(MIN(number))?

4

我正在寻找按人分组的最小数的平均值总体)。

我的表格如下:

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。这就是我要找的-一个单一的数字。

我的真实数据有几百行,所以不算太大。但我无法想到如何用一个简单的语句来完成。谢谢您的任何帮助。

4个回答

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


更新:我从最终的除法中删除了两个“DISTINCT”。除此之外,完美无缺。再次感谢! - Todd Webb

2
选择最小值集合很简单。后面需要使用cast()以避免整数除法。您也可以通过将其转换为float而不是decimal来避免整数除法。(但应注意,浮点数是“有用的近似值”。)
select name, cast(min(rank) as decimal) as min_rank
from Table1
group by name

现在您可以将“minimums”用作公共表达式,并从中进行选择。

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


啊,这个也完美地运行了,但稍微简单一些。非常感谢你。 - Todd Webb

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

-1

我认为最简单的方法是

对于最大值

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

求平均值

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

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