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です。3 人の MIN(Rank) が1で、他の 3 人の MIN(Rank) が2であるためです。それが私が探しているものです - 単一の数字。

私の実際のデータには数百行あるので、それほど大きくはありません。しかし、これを 1 つの簡単なステートメントで行う方法がわかりません。助けてくれてありがとう。

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() は、後で整数除算を避けるために必要です。10 進数ではなく浮動小数点数にキャストすることで、整数除算を回避することもできます。(ただし、浮動小数点数は「有用な近似値」であることに注意してください。)

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 に答える