2016-10-27 11 views
1

Ich habe ein Problem mit der Berechnung einer Variablen. Stellen wir uns vor, wir hätten eine Tabelle mit ID, Datum und Gehalt. Und jetzt ist es meine Aufgabe, für jeden Tag das durchschnittliche Gehalt in den letzten 6 Monaten herauszufinden. Gibt es eine andere Möglichkeit, diesen Wert anstelle des kartesischen Produkts zu erhalten?Wie bekomme ich den Durchschnittswert in den letzten 6 Monaten

Meine vorgeschlagene Auflösung:

select ID, Date, AVG(Salary2) 
from 
(
select tab1.ID as ID, tab1.Date as Date, tab2.Date as Date2, tab2.Salary as Salary2 
from table tab1 
**JOIN** 
(select ID, Date, Salary from table) tab2 
on tab1.ID = tab2.ID 
and tab1.Date >= tab2.Date 
and add_months(tab2.Date, 5) >= tab1.Date 
) group by ID, Date; 

Ich gehe davon aus, dass dieser Ansatz nicht wirksam ist. Ich denke, dass es in Bezug auf große Tische zu zeitaufwendig ist.

Gibt es einen anderen Ansatz? Oder wie soll ich dieses Skript optimieren?

Danke

+0

Könnten Sie bitte Beispieldaten bereitstellen? – Conqueror

+0

und erwartetes Ergebnis? –

Antwort

0

Es ist nicht so klar, was Sie fordern, aber ich nehme an, Sie suchen dafür:

select ID, Date, 
    AVG(Salary2) OVER (
    PARTITION BY ID 
    ORDER BY DATE 
    RANGE BETWEEN INTERVAL '6' MONTH PRECEDING AND CURRENT ROW) 
from table tab1; 

oder als Kurzschnitt:

select ID, Date, 
    AVG(Salary2) OVER (
    PARTITION BY ID 
    ORDER BY DATE 
    RANGE INTERVAL '6' MONTH PRECEDING) 
from table tab1; 
+0

das ist, was ich gesucht habe! Vielen Dank! –

+0

In diesem Fall bitte die Antwort als akzeptiert markieren. –

Verwandte Themen