2017-06-14 3 views
0

nimmt ich eine Tabelle mit den folgenden Spalten:SQL: in Werten zieht mit Aggregaten assoziiert

ID1, ID2, Wert

Für jeden ID1, kann es mehr als ein ID2 und entsprechender Wert, dh :

a,1,5 
a,2,6 
a,3,7 

.

Edit: Simpler version of ask: 
How can I pull ID1, Max(ID2), Value without having to group on value (i want 
to pull the value that corresponds to the max(id2) and without having to do a second join. 

Ich versuche, einen Weg, um herauszufinden, folgendes zu bieten: ID1, Min (ID2), Max (ID2), zusammen mit den Werten mit der Min-/Max-ID2 zugeordnet:

a, 1,3,5,7

der einzige Weg, ich habe kommen mit etwas entlang der Linien von:

select 
a.id1, a.min_id2, a.max_id2, b.value as min_value, c.value as max_value 
from (select id1, min(id2) as min_id2, max(id2) as max_id2) from table group by 1) a 
left outer join (select id1, id2, value from table) b on a.min_id2 = b.id2 
left outer join (select id1, id2, value from table) c on a.max_id2 = c.id2 

Dies ist ein hypothetisches Beispiel, aber auf meine Daten das laufen nimmt ein extrem lange t ich. Ich habe gehofft, dass es eine Art von Abkürzung geben könnte, von der ich nichts weiß.

Antwort

1

Wenn Sie beide min/max in einer einzigen Zeile mehrere OLAP-Funktionen verwenden können (aber alle werden in einem einzigen Schritt berechnet werden, in Explain):

SELECT t.*, 
    -- max id2 
    Max(id2) Over (PARTITION BY id1), 
    -- and corresponding value 
    Last_Value(value) 
    Over (PARTITION BY id1 
     ORDER BY id2 
     ROWS BETWEEN Unbounded Preceding AND Unbounded Following) 
FROM table AS t 
QUALIFY -- row with min id2 
    Row_Number() 
    Over (PARTITION BY id1 
     ORDER BY id2) = 1 
Verwandte Themen