У меня есть таблица с несколькими календарями внутри, и мне нужно получить предыдущий рабочий день для каждой строки в таблице.
Calendar ID Date Business Day Previous Business Day
AC1 24/12/2030 Y -
AC1 25/12/2030 N 24/12/2030
AC1 26/12/2030 N 24/12/2030
AC1 27/12/2030 Y 24/12/2030
AC1 28/12/2030 N 27/12/2030
AC1 29/12/2030 N 27/12/2030
AC1 30/12/2030 Y 27/12/2030
AC1 31/12/2030 Y 30/12/2030
AC2 01/01/2010 Y -
AC2 02/01/2010 N 01/01/2010
AC2 03/01/2010 N 01/01/2010
AC2 04/01/2010 Y 01/01/2010
AC2 05/01/2010 Y 04/01/2010
Я пытался использовать функцию LAG для достижения этой цели но я не могу получить правильный возврат для каждого элемента. В итоге я разделил его на два запроса. Когда рабочий день является рабочим, я могу использовать:
CASE WHEN BUSINESS_DAY = 'Y' THEN LAG(CALENDAR_DATE,1,null) OVER(PARTITION BY CALENDAR_ID Order By CALENDAR_ID asc, CALENDAR_DATE asc) FROM CALENDAR Where BUSINESS_DAY = 'Y'
Когда это нерабочий день, я должен был поместить его в табличную функцию и применить кросс-кросс (есть миллионы строк, и это очень медленно). Есть ли способ лучше?