Используя таблицу kk_holidays_list из задачи "Календарь с индикаторами выходных дней", написать запрос, выдающий календарь на 2012 год со следующими полями:
- дата
- является ли эта дата выходным днем
- последний выходной день, который предшествовал этой дате
- сколько было выходных дней с начала года до этой даты включительно
- сколько всего выходных дней в месяце, к которому относится эта дата
В иерархическом подзапросе q1 составим простой календарь на 2012 год.
В подзапросе q2 добавим вспомогательные поля - номер месяца (month_num), является ли день выходным (is_holiday) и предыдущий выходной день (lag_operdate), который получается содержащим NULLs.
Во внешнем запросе уберем эти NULLs с помощью last_value, а также используем два варианта оператора sum over - берем сумму с нарастающим итогом за год и общую сумму за каждый месяц:
select dt,
is_holiday,
last_value(lag_operdate ignore nulls) over(order by dt) previous_holiday,
sum(is_holiday) over(order by dt) holidays_since_2012_start,
sum(is_holiday) over(partition by month_num) holidays_during_month
from (select q1.dt,
h.operdate,
to_char(q1.dt, 'mm') month_num,
decode(h.operdate, null, '0', '1') is_holiday,
lag(h.operdate) over(order by q1.dt) lag_operdate
from (select to_date('31.12.2011', 'dd.mm.yyyy') + level dt
from dual
connect by level <= 366) q1
left join kk_holidays_list h
on q1.dt = h.operdate) q2
order by dt;