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