Добрый день.
Возникла у меня такая задача:
Есть таблица, скажем, 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-й рабочий день?
Есть идеи, как это сделать красиво?