2016-04-16 11 views
0

Ich habe die folgende SQL-Abfrage, die ich verwende, um einige Statistiken (AVG, MAX, MIN und COUNT) jeder Gruppe in meiner Datenbank zu erhalten. Die Tische sind zwei. Teams und Benutzer. Jedes Team hat viele Benutzer.Gruppieren In MSSQL mit den ersten 10 Zeilen jeder Gruppe

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 

Allerdings hat die Tabelle Benutzer eine weitere Spalte „Experience“ und ich möchte in jeder Gruppe die gleichen Statistiken für die Top 10 der Benutzer erhalten, basierend auf dieser Spalte.

Irgendeine Idee?

+0

Funktioniert das wirklich? Die Join-Bedingung sieht nicht korrekt aus. –

Antwort

1

Die Lösung ist row_number(), in diesem Fall zu verwenden, ich glaube, in einer Unterabfrage:

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; 

Ich vermute, dass Ihre Joinbedingungen falsch sind. Ich würde erwarten, dass die richtige Join-Bedingung etwas wie u.TeamId anstelle von u.Id verwenden. Wenn dies der Fall ist, müssen Sie die Spalte partition by der Spalte join anpassen.

+0

Es ist wahr, dass die Spaltennamen etwas anders sind, aber es funktioniert. Sowohl meine Version als auch deine Version. Also vielen Dank :) – Tasos

0

Gordon Linoffs Lösung sieht gut aus, Sie können auch DENSE_RANK() oder RANK() über ROW_NUMBER() betrachten, um "bessere" realistische Statistiken zu erhalten, wenn die Erfahrung für viele Benutzer gleich sein könnte.

Verwandte Themen