Это можно сделать, создав календарь и добавив его к данным рекламной акции.
В приведенном ниже примере создается субфактор calendar
, который включает одну запись для каждой недели (включая неделю 53) для 2017, 2018, 2019 годов, а затем объединяет любую запись promotion
, чьи start_yearweek
и end_yearweek
пересекаются с этим календарная неделя.
WITH CALENDAR AS (
SELECT (100 * YEAR_OFFSET) + WEEK_OFFSET AS CALENDAR_WEEK
FROM (
SELECT LEVEL AS WEEK_OFFSET
FROM DUAL
CONNECT BY LEVEL <= 53)
CROSS JOIN (SELECT 2016 + LEVEL AS YEAR_OFFSET
FROM DUAL
CONNECT BY LEVEL <= 3))
SELECT GROUP_ID,
CALENDAR_WEEK,
PROMOTION_DESCRIPTION,
MEDIA_SUPPORT
FROM CALENDAR
INNER JOIN PROMOTION
ON CALENDAR_WEEK
BETWEEN START_YEARWEEK AND END_YEAR_WEEK;
Результат:
GROUP_ID CALENDAR_WEEK PROMOTION_DESCRIPTION MEDIA_SUPPORT
40284 201726 Gehwol / Wartner 2e halve prijs Radio
40315 201726 Voordeelzakken En Dozen Online Campagne
40315 201727 Voordeelzakken En Dozen Online Campagne
3 rows selected.
РЕДАКТИРОВАТЬ: Для создания календаря ISO-недели можно использовать маску формата «IW» в TO_DATE
.
Этот пример календаря генерирует недели ISO с 2014 по 2022 год:
SELECT DISTINCT TO_NUMBER(TO_CHAR((DATE '2014-01-01' + LEVEL),'YYYYIW'))
AS ISO_CALENDAR_WEEK FROM DUAL
CONNECT BY (DATE '2014-01-01' + LEVEL) < DATE '2023-01-01';
В примере продвижения это можно использовать как:
WITH CALENDAR AS (
SELECT DISTINCT TO_NUMBER(TO_CHAR((DATE '2014-01-01' + LEVEL),'YYYYIW'))
AS ISO_CALENDAR_WEEK FROM DUAL
CONNECT BY (DATE '2014-01-01' + LEVEL) < DATE '2023-01-01' )
SELECT GROUP_ID,
ISO_CALENDAR_WEEK,
PROMOTION_DESCRIPTION,
MEDIA_SUPPORT
FROM CALENDAR
INNER JOIN PROMOTION
ON ISO_CALENDAR_WEEK
BETWEEN START_YEARWEEK AND END_YEAR_WEEK;
Результат:
GROUP_ID ISO_CALENDAR_WEEK PROMOTION_DESCRIPTION MEDIA_SUPPORT
40315 201727 Voordeelzakken En Dozen Online Campagne
40284 201726 Gehwol / Wartner 2e halve prijs Radio
40315 201726 Voordeelzakken En Dozen Online Campagne
3 rows selected.