2016-07-11 6 views
1
ID| tag | version 
-----+-----+----- 
1| A | 10 
2| A | 20 
3| B | 99 
3| C | 30 
3| F | 40 

gewünschte Ausgabe:SQL: der maximalen Wert einer Spalte erhalten und die entsprechenden anderen Spalten

1 A 10 
2 A 20 
3 B 99 

Wie kann ich die max Version jeder ID und den entsprechenden Tag für diese Version? Geschwindigkeit ist wichtig (ich habe ungefähr 28m Reihen), also wird eine geschachtelte Auswahl es nicht tun. Auch eine einfache Gruppierung nach ID mit einer Max (Version) funktioniert nicht, da ich auch das entsprechende Tag benötige, wo die Version max.

+2

Diese Frage gestellt wird und endlos beantwortet. Einige der Antworten sind korrekt. – Strawberry

+0

Ich habe versucht, eine Gruppe von ID mit max (Version), aber das funktioniert nicht, weil ich auch das Tag benötigen – Nickpick

+0

Schau, es gibt eine richtige nur dort -----> – Strawberry

Antwort

2

Verwendung ROW_NUMBER():

SELECT s.id,s.tag,s.version FROM (
    SELECT t.*, 
      ROW_NUMBER() OVER(PARTITION BY t.id ORDER BY t.version DESC) as rnk 
    FROM YourTable t) s 
WHERE s.rnk = 1 
+0

verschachtelte Auswahl wird sehr langsam Ich nehme an, wenn ich 28m Zeilen habe – Nickpick

+0

Die geschachtelte Auswahl wird die Leistung nicht schaden, es ist nur so können Sie beziehen sich auf 'Rnk' Spalte, die in der inneren Abfrage ausgewertet wird. Führen Sie die Abfrage und dann entscheiden über performace @nickpick – sagi

+0

Aus irgendeinem Grund gibt die Ausgabe viel weniger Ergebnisse als erwartet – Nickpick

2

Versuchen Sie, diese

select id, max(tag) keep(dense_rank first order by VERSION desc) as tag, max(version) as version 
from t group by id 
+0

warum max (tag)? Das Tag ist keine Nummer. auch "FROM Schlüsselwort nicht gefunden, wo erwartet" – Nickpick

+0

Es spielt keine Rolle. Oracle sucht nach Werten in diapason 'erster Ordnung nach VERSION desc'. Es findet sortierte VERSION nach desc (oder max, es ist das gleiche) und gibt die erste begründete Zeile zurück. Dann erhält Oracle Max (Tag) der ersten zurückkommenden Zeile und weil es die einzelne Zeile ist, dann funktioniert Max korrekt. –

+0

@Nickpick "FROM Schlüsselwort nicht gefunden wo erwartet" - "von t" wo t ist Ihre Tabelle. –