2008-09-18 17 views
6

Ich habe eine Tabelle mit Spielergebnissen, so dass mehrere Zeilen pro Konto-ID: scores (id, score, accountid). Ich möchte eine Liste der Top-10-Scorer-IDs und ihrer Ergebnisse.aus der Liste

können Sie eine SQL-Anweisung bieten die Top-10-Scores zu wählen, aber nur eine Punktzahl pro Konto-ID?

Danke!

+0

tun wir Ihre Hausaufgaben? – paulwhit

+4

Hausaufgaben oder nicht, ist die Frage gut IMHO, als ein einfaches DISTINCT wird nicht funktionieren und es ist erforderlich, um es mit einer Aggregationsfunktion zu kombinieren - ein Problem, das ich auch über ein paar Mal gestolpert, und eine Lösung mit auf SO würde uns alle profitieren. –

Antwort

2

Beschränken Sie zuerst die Auswahl auf die höchste Punktzahl für jede Konto-ID. Dann nimm die Top Ten Punkte.

SELECT TOP 10 AccountId, Score 
FROM Scores s1 
WHERE AccountId NOT IN 
    (SELECT AccountId s2 FROM Scores 
    WHERE s1.AccountId = s2.AccountId and s1.Score > s2.Score) 
ORDER BY Score DESC 
+0

Dies scheint besser, weil es die gesamte Zeile auswählt. Die andere maximale Abfrage hat nur die maximale Punktzahl in eine zufällige Zeile für jede Account-ID gesetzt. – Kenzie

+0

Fixed: SELECT * FROM Partituren s1 WHERE accountid IN NICHT (SELECT accountid FROM Partituren s2 WHERE s1.accountid = s2.accountid und s1.score Kenzie

+2

Nur noch offene Frage I habe mit dieser Abfrage ist, dass ich mehr als eine Zeile pro AccountID bekomme, wenn dieses Konto mehr als ein Vorkommen von seiner Top-Punktzahl hat. Wenn also accoundid 6 die Werte 50, 75, 40, 75 aufweist, gibt die Abfrage beide Zeilen mit dem Ergebnis 75 zurück. – Kenzie

2

Versuchen Sie folgendes:

select top 10 username, 
       max(score) 
from usertable 
group by username 
order by max(score) desc 
+1

Ist 'Top 10' neu? Ich kann mich nicht erinnern, es vorher gesehen zu haben? – zigdon

+0

hängt von der DBMS - es war neu für SQL Server 2000 – Danimal

+0

soll ich angegeben mysql habe. Limit hat es geschafft. Vielen Dank. – Kenzie

1

PostgreSQL hat die DISTINCT ON-Klausel, die auf diese Weise funktioniert:

SELECT DISTINCT ON (accountid) id, score, accountid 
FROM scoretable 
ORDER BY score DESC 
LIMIT 10; 

Ich glaube nicht, es Standard ist SQL obwohl, so erwarten, dass andere Datenbanken, es zu tun anders.

4
select username, max(score) from usertable group by username order by max(score) desc limit 10; 
+0

dieser braucht eine "desc" auf die Bestellung von – Magnar

+0

Aktualisiert, danke. – zigdon

1
SELECT accountid, MAX(score) as top_score 
FROM Scores 
GROUP BY accountid, 
ORDER BY top_score DESC 
LIMIT 0, 10

Das sollte in MySQL funktionieren. Es ist möglich, dass Sie möglicherweise 'ORDER BY MAX (Score) DESC' anstelle dieser Reihenfolge verwenden müssen - ich habe meine SQL-Referenz nicht zur Hand.

0

Ich glaube, dass PostgreSQL (mindestens 8.3) erfordert, dass die DISTINCT ON Ausdrücke übereinstimmen müssen ORDER BY Ausdrücke. I.E. Sie können DISTINCT ON (accountid) nicht verwenden, wenn Sie ORDER BY score DESC haben. Um dies zu beheben, fügen Sie ihn in die ORDER BY:

SELECT DISTINCT ON (accountid) * 
FROM scoretable 
ORDER BY accountid, score DESC 
LIMIT 10; 

Mit dieser Methode können Sie alle Spalten in einer Tabelle auswählen. Es gibt nur eine Zeile pro account zurück, auch wenn doppelte 'max' Werte für die Punktzahl vorhanden sind.

Dies war nützlich für mich, da ich nicht die maximale Punktzahl finden konnte (was mit der Funktion max() einfach ist), aber für die letzte Zeit wurde ein Score für eine Account-ID eingegeben.

Verwandte Themen