Реструктурировать данные в строку по неделям на основе диапазона дат

#sql #db2

#sql #db2

Вопрос:

У меня есть такой стол, как этот:

 ID  START_DATE  END_DATE
AA1 2021-01-01  2021-01-27
AA2 2021-01-13  2021-02-09
 

Мне нужно запросить его, чтобы получить список всех понедельников с указанием временных рамок (START_DATE — END_DATE) для каждого идентификатора. Мне нужно, чтобы результат выглядел так:

 ID MONDAY
AA1 2021-01-04
AA1 2021-01-11
AA1 2021-01-18
AA1 2021-01-25
AA2 2021-01-18
AA2 2021-01-25
AA2 2021-02-01
AA2 2021-02-08
 

Я использую DB2. Я извиняюсь за странное название, но я не был уверен, как объяснить эту проблему.

Комментарии:

1. db2 luw ? Какая версия?

Ответ №1:

БАЗОВЫЙ CTE здесь представляет вашу исходную таблицу.

 WITH BASE (ID, START_DATE, END_DATE) AS 
  ( VALUES ('AA1', DATE('2021-01-01'), DATE('2021-01-27')) , 
           ('AA2', DATE('2021-01-13'), DATE('2021-02-09')) 
  ) , 
  
MONDAYS (MONDAY_DATE) AS 
 (  SELECT ( MIN(START_DATE)   ( 9 - DAYOFWEEK(MIN(START_DATE)) )  DAYS) FROM BASE  
   UNION ALL
    SELECT MONDAY_DATE    7 DAYS FROM MONDAYS 
      WHERE MONDAY_DATE < ( SELECT MAX(END_DATE) FROM BASE)     
 )

SELECT ID, MONDAY_DATE FROM BASE, MONDAYS 
  WHERE MONDAY_DATE BETWEEN START_DATE AND END_DATE
;
 

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

  ID  MONDAY_DATE
 --- -----------
 AA1 2021-01-04
 AA1 2021-01-11
 AA1 2021-01-18
 AA1 2021-01-25
 AA2 2021-01-18
 AA2 2021-01-25
 AA2 2021-02-01
 AA2 2021-02-08
 

Поскольку у вас уже есть базовая таблица, ваш запрос должен начинаться как :

 WITH MONDAYS AS (...  
 

Комментарии:

1. вы, сэр, какой-то гений. Спасибо!