Holen Sie sich nur Zeilen mit maximalem Gruppenwert


8

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)


6
Wie ist Ihre aktuelle Anfrage ineffizient?
Dekso

Diese Frage hat bereits alle Arten von Antworten mit unterschiedlicher Leistung auf SO: stackoverflow.com/questions/586781/…
alexkovelsky

Antworten:


12

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.


In diesem Fall sollten alle Datensätze zurückgegeben werden, da 3 für "b" und 2 für "a" die höchsten Gruppenwerte für "b" und "a" sind. Nein, es ist nicht auf 3 beschränkt. Es können n Datensätze zurückgegeben werden, nur dass diese Datensätze sind in der Maximalwertgruppe für ein bestimmtes Element
Spuppis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.