2016-04-16 15 views
0

データベース内の各グループの統計情報(AVG、MAX、MIN、COUNT)を取得するために使用する次のSQLクエリがあります。テーブルは2つです。チームとユーザー。各チームには多くのユーザーがいます。グループ化MSSQLで各グループの上位10行を使用

SELECT t.id, AVG(u.Age) AS Average, MIN(u.Age) AS Minimum, MAX(u.Age) AS Maximum, COUNT(u.id) AS NumberOfUsers 

FROM Teams t 

INNER JOIN Users u ON t.id = u.id 

WHERE t.status IS NOT NULL 

GROUP BY t.id 

ORDER BY Average Desc 

しかし、テーブルのユーザーが別の列「経験」を持って、私はその列に基づいて、各グループの上位10人のユーザに同じ統計情報を取得したいです。

+0

これは実際には機能しますか?結合条件が正しく表示されません。 –

答えて

1

ソリューションは、このような場合には、row_number()を使用することです、私はサブクエリで考える:

SELECT t.id, AVG(u.Age) AS Average, MIN(u.Age) AS Minimum, 
     MAX(u.Age) AS Maximum, COUNT(u.id) AS NumberOfUsers 
FROM Teams t INNER JOIN 
    (SELECT u.*, 
      ROW_NUMBER() OVER (PARTITION BY id ORDER BY experience DESC) as seqnum 
     FROM Users u 
    ) u 
    ON t.id = u.id AND -- is this really the right join condition? 
     seqnum <= 10 
WHERE t.status IS NOT NULL 
GROUP BY t.id 
ORDER BY Average Desc; 

私はあなたの参加条件が間違っていると思われます。私は適切な結合条件がu.Idの代わりにu.TeamIdのようなものを使うと期待します。その場合は、partition by列をjoin列と同じに変更する必要があります。

+0

列名はわずかに異なりますが、実際には機能します。私のバージョンとあなたのバージョンの両方。だから、ありがとう:) – Tasos

0

Gordon Linoffのソリューションはよく見えますが、ROW_NUMBER()にはDENSE_RANK()またはRANK()を考慮すると、多くのユーザーにとって同じような経験があれば「より良い」現実的な統計を得ることができます。

関連する問題