我正在寻找 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 即可。这就是我要找的 - 一个数字。
我的真实数据有几百行,所以它并不是非常大。但我无法弄清楚如何在一个简单的声明中做到这一点。谢谢你的帮助。
答案 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;
答案 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;