SQL/Vertica - объединение событий с начальной и конечной датой в календаре

Короче

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

Что у меня сейчас

Таблица 1

PromoName  BeginDate   EndDate     PromoType    
Promo1     2016-03-10  2016-03-12  Type1
Promo2     2016-03-11  2016-03-12  Type2
Promo3     2016-03-14  2016-03-15  Type1

Таблица 2

Date   
2016-03-09
2016-03-10
2016-03-11
2016-03-12
2016-03-13
etc

Что бы я хотел иметь

Date        PromoActive  PromoType1Active  PromoType2Active
2016-03-09  0            0                 0
2016-03-10  1            1                 0
2016-03-11  1            1                 1
2016-03-12  1            1                 1
2016-03-13  0            0                 0
2016-03-14  1            1                 0
2016-03-06  1            1                 0

1 ответ

Это довольно просто. Нет необходимости использовать расширенные функции Vertica для анализа временных рядов...

Предполагая, что у вас есть:

SQL> select * from table1;
 promoname | begindate  |  enddate   | promotype 
-----------+------------+------------+-----------
 Promo1    | 2016-03-10 | 2016-03-12 | Type1
 Promo3    | 2016-03-14 | 2016-03-15 | Type1
 Promo2    | 2016-03-11 | 2016-03-12 | Type2

А также:

SQL> select * from table2 order by sdate;
   sdate    
------------
 2016-03-09
 2016-03-10
 2016-03-11
 2016-03-12
 2016-03-13
 2016-03-14
 2016-03-15
 2016-03-16

Тогда простой SQL, как этот, должен работать:

select 
    sdate, 
    max(case when ( sdate between begindate and enddate ) then 1 else 0 end) as PromoActive,                                                                         
    max(case when ( sdate between begindate and enddate ) and promotype = 'Type1' then 1 else 0 end) as PromoType1Active, 
    max(case when ( sdate between begindate and enddate ) and promotype = 'Type2' then 1 else 0 end) as PromoType2Active
from 
    table1 cross join table2 
group by sdate
order by sdate
;
   sdate    | PromoActive | PromoType1Active | PromoType2Active 
------------+-------------+------------------+------------------
 2016-03-09 |           0 |                0 |                0
 2016-03-10 |           1 |                1 |                0
 2016-03-11 |           1 |                1 |                1
 2016-03-12 |           1 |                1 |                1
 2016-03-13 |           0 |                0 |                0
 2016-03-14 |           1 |                1 |                0
 2016-03-15 |           1 |                1 |                0
 2016-03-16 |           0 |                0 |                0
Другие вопросы по тегам