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

4 回答 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 小提琴演示

于 2012-11-16T18:48:06.927 回答
2

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

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

于 2012-11-16T20:02:19.267 回答
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
于 2012-11-16T18:46:34.563 回答
-1

我认为最简单的将是

最大

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

平均

select name , avg_rank = avg(rank)
from table
cgroup by name;
于 2013-09-25T12:31:02.033 回答