Holen Sie die Zeile, die hat den Max-Wert für eine Spalte in SQL Server
Fand ich eine Frage, die war sehr ähnlich wie diese, aber mit features, die scheinen exklusiv für Oracle. Ich bin auf der Suche um dies zu tun, die in SQL Server.
Ich habe eine Tabelle wie diese:
MyTable
--------------------
MyTableID INT PK
UserID INT
Counter INT
Jeder Benutzer kann über mehrere Zeilen mit unterschiedlichen Werten für Counter
in jeder Zeile. Ich muss die Zeilen mit der höchsten Counter
Wert für jeden Benutzer.
Wie kann ich dies in SQL Server 2005?
Die besten, die ich mit oben kommen kann ist eine Abfrage der gibt die MAX(Counter)
für jeden UserID
, aber ich brauche die gesamte Zeile, weil Sie andere Daten in dieser Tabelle nicht angezeigt in meiner Tabelle definition für Einfachheit.
EDIT: Es ist gekommen, um meine Aufmerksamkeit von einigen der Antworten in diesem post, dass ich vergaß ein wichtiges detail. Es ist möglich, 2+ Zeilen, in denen Sie eine Benutzerkennung haben, können die gleichen MAX-Zähler-Wert. Beispiel unten aktualisiert, was die erwarteten Daten - /Ausgabe sein sollte.
Mit diesen Daten:
MyTableID UserID Counter
--------- ------- --------
1 1 4
2 1 7
3 4 3
4 11 9
5 11 3
6 4 6
...
9 11 9
Möchte ich diese Ergebnisse für den doppelten MAX-Werte, wählen Sie den ersten Vorkommnis in der Reihenfolge der SQL-server wählt Sie. Welche Zeilen zurückgegeben werden, sind nicht wichtig in diesem Fall, solange die UserID - /Zähler-Paare sind Verschieden:
MyTableID UserID Counter
--------- ------- --------
2 1 7
4 11 9
6 4 6
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich mag die Verwendung einer Common Table Expression, für diesen Fall, mit einem geeigneten ROW_NUMBER () - Funktion in es:
Daß Partitionen, die Daten über die Benutzer-id, ordnet es durch Counter (absteigend) für jeden Benutzer, und dann als Beschriftung der Zeilen, beginnend mit 1 für jeden Benutzer. Wählen Sie nur die Zeilen mit einer 1 für die rownumber-und Sie haben Ihre max. Werte pro Benutzer.
Es ist so einfach 🙂 Und ich Ergebnisse zu bekommen, so etwas wie dieses:
Nur ein Eintrag pro user, egal wie viele Zeilen pro Benutzer zufällig den gleichen max-Wert.
Ich denke, das wird Ihnen helfen.
distinct
. Eingroup by
machen das automatisch.Gibt es mehrere Möglichkeiten, dies zu tun, nehmen Sie einen Blick auf diese Darunter eine Aggregierte Spalte die Zugehörigen Werte sind Mehrere Methoden gezeigt, einschließlich des performance-Unterschiede
Hier ist ein Beispiel
Versuchen, diese... ich bin mir ziemlich sicher, dass dies der einzige Weg, um wirklich sicherzustellen, dass Sie eine Zeile pro Benutzer.