2017-01-11 7 views
1

Я пытаюсь получить общее количество за то, сколько из каждого продукта было продано за последние 30 дней, в дополнение к тому, сколько было продано каждый день. Я попытался сделать это с помощью функции окна между предыдущей и текущей строкой, но проблема в том, что продукты не всегда делают продажу каждый день, поэтому моя оконная функция оглядывается назад на 30 строк вместо 30 дней.Функция окна более 30 дней, но отсутствуют строки

Образец данных выглядит следующим образом:

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 

Мой запрос:

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 

Как вы можете видеть, когда попадает дата 2016-11-04 wrong_answer еще оглядки 30 строк вместо 30 дней. Есть ли способ сделать то, что я пытаюсь сделать?

Благодаря

+0

Возможно, использовать подзапрос? например дайте вашей таблице псевдоним (например, 'PS') и получим' mycolumn = (выберите сумму (sales) из prod_sales, где dateiff (день, дата, PS.date) между 0 и 30) ' – ZLK

+0

Это было подробно обсуждено на dba.se: [Срочная сумма диапазона дат с использованием оконных функций] (http://dba.stackexchange.com/questions/114403/date-range-rolling-sum-using-window-functions) –

ответ

1

Если окно 30 дней установка ..

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 

Если окно 1 месяц установка ..

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 

Примечание: Получение немного отличается от ваш правильный ответ ... исправьте меня, если я не получу ваш вопрос правильно.

+0

Да, первое, что я 'ищу, начиная с 30 дней назад. Фактически, результаты в файле correct_answer имели 31-дневное окно. Это отлично работает Спасибо Pramod! – onji