Получить n-й рабочий день после заданного дня
От: teapot2  
Дата: 05.11.20 12:42
Оценка:
Добрый день.

Возникла у меня такая задача:

Есть таблица, скажем, calendar, в ней два поля: day DATE и work INTEGER (0 -нерабочий день, 1-рабочий). В таблице есть записи по всем прошлым датам со времени царя Гороха и будущим датам на текущий год. И понадобилось мне извлечь из нее данные в таком формате:
(дата, дата 5-того рабочего дня после первой даты).

Не мудрствуя лукаво, я написал следующий запрос (СУБД PostgreSQL):

with nextworkday AS (select c1.day d1, min (c2.day) as d2 from calendar c1
left join calendar c2 on c1.day < c2.day AND c2.work = 1 group by c1.day)

select c.datestamp, n5.d2 from calendar c
left join nextworkday n1 on n1.d1 = c.day
left join nextworkday n2 on n2.d1 = n1.d2
left join nextworkday n3 on n3.d1 = n2.d2
left join nextworkday n4 on n4.d1 = n3.d2
left join nextworkday n5 on n5.d1 = n4.d2
order by 1;


Но как-то это кондово, некрасиво. Данный запрос должен стать подзапросом в тяжелом счетном запросе. Хочется переписать более изящно, и чтобы константа 5 (5-й рабочий день) была параметром запроса. Вдруг завтра понадобится 22-й рабочий день?

Есть идеи, как это сделать красиво?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.