it-swarm.com.de

Holen Sie sich nur Zeilen mit maximalem Gruppenwert

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)
8
spuppis

Die erste Antwort verwendet einen CTE, um max (group_value) auszuwählen und dann mit der Tabelle zu verbinden.

with maxgv as 
(
    select element, max(group_value) maxg
    from x
    group by element
)
select x.element, x.group_value, x.value
from   maxgv
inner join x
on         x.element = maxgv.element
and        x.group_value = maxgv.maxg
;

Dieser verwendet die Funktion RANK ():

with grp as 
 (
     select element, group_value, value,
            rank() over (partition by element order by element, group_value desc) rn
     from x
)
select element, group_value, value
from   grp
where  rn = 1;

Beide geben das gleiche Ergebnis zurück:

| element | group_value | value |
|---------|-------------|-------|
| a       | 2           | 1500  |
| a       | 2           | 2500  |
| b       | 1           | 1000  |

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.

11
McNets