2017-01-11 2 views
1

Ich versuche, eine laufende Summe für wie viele von jedem Produkt in den letzten 30 Tagen verkauft wurden, zusätzlich zu, wie viele wurden jeden Tag verkauft. Ich habe versucht, dies mit einer Fensterfunktion zwischen der vorhergehenden und der aktuellen Reihe zu tun, aber das Problem ist, dass Produkte nicht immer einen Verkauf jeden Tag machen, so dass meine Fensterfunktion 30 Zeilen statt 30 Tage zurückblickt.Window-Funktion über 30 Tage, aber fehlende Zeilen

Beispieldaten wie folgt aussieht:

date  | prod_id | sales | wrong_answer | correct_answer 
2016-09-22 123  5  5    5 
2016-09-24 123  2  7    7 
2016-09-30 123  5  12    12 
2016-10-01 123  4  16    16 
2016-10-06 123  6  22    22 
2016-10-18 123  4  26    26 
2016-10-20 123  6  32    32 
2016-11-04 123  14  46    30 
2016-11-05 123  40  86    70 
2016-11-25 123  30  116   94 
2016-11-26 123  9  125   103 
2016-12-10 123  12  137   115 
2016-12-12 123  8  145   123 
2016-12-16 123  4  149   127 
2016-12-31 123  3  152   130 
2017-01-09 123  4  156   134 
2016-09-22 456  etc  etc   etc 

Meine Frage ist:

SELECT 
    date, 
    prod_id, 
    sales, 
    SUM(sales) OVER (PARTITION BY prod_id OVER BY date ASC ROWS BETWEEN 30 PRECEDING AND CURRENT ROW) as wrong_answer 
FROM prod_sales 

Wie Sie sehen können, wenn das Datum trifft 2016.11.04 wrong_answer noch im Rückblick 30 Zeilen statt 30 Tage. Gibt es eine Möglichkeit, das zu erreichen, was ich versuche?

Dank

+0

Vielleicht eine Unterabfrage verwenden? z.B. Geben Sie Ihrer Tabelle einen Alias ​​(wie 'PS') und haben Sie' mycolumn = (wählen Sie Summe (Umsatz) von prod_sales wobei datediff (Tag, Datum, PS.date) zwischen 0 und 30) ' – ZLK

+0

Dies wurde sehr ausführlich diskutiert dba.se: [Datumsbereich rollende Summe mit Fensterfunktionen] (http://dba.stackexchange.com/questions/114403/date-range-rolling-sum-using-window-functions) –

Antwort

1

Wenn Sie Fenster von 30 Tagen einstellen ..

select t1.[date], t1.prod_id, t1.sales, 
(select distinct sum(sales) over(order by prod_id) 
from prod_sales as t2 where 
t2.date<= t1.date and t2.date > dateadd(day,-30,t1.date) and t2.prod_id = t1.prod_id) 
from prod_sales as t1 

Wenn Sie Fenster 1 Monat setzen ..

select t1.[date], t1.prod_id, t1.sales, 
(select distinct sum(sales) over(order by prod_id) 
from prod_sales as t2 where 
t2.date<= t1.date and t2.date > dateadd(month,-1,t1.date) and t2.prod_id = t1.prod_id) 
from prod_sales as t1 

Hinweis: Immer ein bisschen anders deine richtige Antwort ... korrigiere mich, wenn ich deine Frage nicht richtig verstanden habe.

+0

Ja, der erste ist was ich suche seit vor 30 Tagen. Tatsächlich hatten die Ergebnisse in correct_answer ein 31-Tage-Fenster. Das funktioniert super Danke Pramod! – onji

Verwandte Themen