Redshift: группировка строк по диапазону и добавление в выходные столбцы - PullRequest
1 голос
/ 23 апреля 2020

У меня есть такие данные:

Таблица 1: (лоты, обозначенные как 1, 2, 3 и c. С датой продаж в эпохах и количеством продаж на данную дату как Число. Данные охватывают только последние 12 недель продаж)

Item | Sales_Date | Number   
1    1587633401000 2  
1  1587374201000  3  
1  1585732601000  4  
1  1583054201000  1  
1 1582190201000  2   
1 1580548601000  3  

В качестве выходных данных я представляю одну строку для каждой позиции, в каждом столбце которой показаны общие продажи за каждый отдельный месяц:

Вывод:

Item | Month_1_Sales | Month_2_Sales | Month_3_Sales  
1         3                 3               9  

Поскольку единственная продажа, которая произошла, произошла в 1580548601000 (продажи = 3), в то время как 1583054201000 (продажи = 1) и 1582190201000 (продажи = 2) происходят в Месяц 2 и c.

Поэтому мне нужно разделить даты продаж по группам по месяцам, суммировать их цифры продаж, а затем эти цифры в столбцах. Я очень новичок в SQL, поэтому не знаю с чего начать. Кто-нибудь сможет помочь?

1 Ответ

0 голосов
/ 23 апреля 2020

Вы можете извлечь месяцы из отметки времени, используя:

select extract(month from (timestamp 'epoch' + sales_date / 1000 * interval '1 second'))

Тем не менее, я предполагаю, что вам действительно нужны 4-недельные периоды, поскольку данные за 12 недель не являются 3 полными месяцами. Это будет иметь больше смысла для меня. Для расчета используйте разницу с самой ранней даты, а затем используйте арифметику c и условную агрегацию:

select item,
       sum(case when floor((sales_date - min_sales_date) / (1000 * 60 * 60 * 24 * 4 * 7)) = 2
                then number
           end) as month_3_sales
       sum(case when floor((sales_date - min_sales_date) / (1000 * 60 * 60 * 24 * 4 * 7)) = 1
                then number
           end) as month_2_sales
       sum(case when floor((sales_date - min_sales_date) / (1000 * 60 * 60 * 24 * 4 * 7)) = 0
                then number
           end) as month_3_sales
from (select t1.*,
             min(sales_date) over () as min_sales_date
      from table1 t1
     ) t1
group by item;
...