#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. вы, сэр, какой-то гений. Спасибо!