Zum Beispiel haben wir:
element | group_value | value
a | 1 | 2000
a | 2 | 1500
a | 2 | 2500
b | 1 | 1000
Ich möchte nur die letzten 3 Datensätze zurückgeben, da dies die Datensätze mit dem maximalen Gruppenwert für jedes Element sind.
Ich weiß für eine Lösung mit Unterabfrage, aber gibt es eine effiziente?
Zur Verdeutlichung: für Element 'a':
2 ist der höchste Gruppenwert, daher werden die Zeilen 2 und 3 zurückgegeben> (und nicht die erste Zeile, da der Gruppenwert nicht der höchste ist).
für Element 'b':
1 ist> höchster Gruppenwert, daher werden Zeile (n) 4 zurückgegeben
Meine (Performance-Vice nicht gut) Lösung für das Problem ist:
select *
from x x1
where (element, group_value) in (select element, max(group_value)
from x x2
where x1.element = x2.element
group by x2.element)
postgresql
group-by
greatest-n-per-group
spuppis
quelle
quelle
Antworten:
Die erste Antwort verwendet einen CTE, um max (group_value) auszuwählen und dann mit der Tabelle zu verbinden.
Dieser verwendet die Funktion RANK ():
Beide geben das gleiche Ergebnis zurück:
Rextester hier
Um die Leistung zu überprüfen und zu vergleichen, benötigen wir jedoch das Tabellenschema. Ich weiß nicht, welcher Index Ihre aktuelle Abfrage verwendet.
quelle