У меня есть запрос, содержащий 0
или 1
в столбце.В демонстрационных целях я заменил 1
на 77
, чтобы его было легче увидеть:
select dates.d the_date
, case TO_CHAR(dates.d, 'd') when '7' then 0 when '1' then 0
else 77
end as is_workday
from (SELECT (to_date('01.01.2019','dd.mm.yyyy') + (LEVEL -1))
AS d FROM DUAL connect by level <=(
to_date('31.12.2020','dd.mm.yyyy')-(to_date('01.01.2019','dd.mm.yyyy')))
) as dates
Результатом является просто последовательный столбец даты и маркер, если эта дата является рабочим или нет.(в реальной жизни я также делаю расчет выходных, но это не проблема):
| THE_DATE | IS_WORKDAY |
| 2019-01-01 00:00:00 | 77 |
| 2019-01-02 00:00:00 | 77 |
| 2019-01-03 00:00:00 | 77 |
| 2019-01-04 00:00:00 | 77 |
| 2019-01-05 00:00:00 | 0 |
| 2019-01-06 00:00:00 | 0 |
| 2019-01-07 00:00:00 | 77 |
| 2019-01-08 00:00:00 | 77 |
| 2019-01-09 00:00:00 | 77 |
| 2019-01-10 00:00:00 | 77 |
....
Я хочу добавить промежуточную сумму к is_workday
, что означает совокупное значение.Я уверен, что оконные функции Oracles созданы для этого.
SELECT x.the_date
, x.is_workday
, sum(x.is_workday) over (
partition by x.the_date -- define the window
order by x.the_date asc -- order inside window
rows between unbounded preceding -- sum to top
and current row -- sum ending here
) as workdays_cumul
FROM (
select dates.d the_date
, case TO_CHAR(dates.d, 'd') when '7' then 0 when '1' then 0
else 77
end as is_workday
from (SELECT (to_date('01.01.2019','dd.mm.yyyy') + (LEVEL -1))
AS d FROM DUAL connect by level <=(
to_date('31.12.2020','dd.mm.yyyy')-(to_date('01.01.2019','dd.mm.yyyy')))
) as dates
) x
order by x.the_date
;
Но я должен кое-что здесь упустить, потому что я не получаю промежуточную сумму, а просто само значение.
| THE_DATE | IS_WORKDAY | WORKDAYS_CUMUL |
| 2019-01-01 00:00:00 | 77 | 77 |
| 2019-01-02 00:00:00 | 77 | 77 |
| 2019-01-03 00:00:00 | 77 | 77 |
| 2019-01-04 00:00:00 | 77 | 77 |
| 2019-01-05 00:00:00 | 0 | 0 |
| 2019-01-06 00:00:00 | 0 | 0 |
| 2019-01-07 00:00:00 | 77 | 77 |
| 2019-01-08 00:00:00 | 77 | 77 |
....
Очевидно, это должно быть:
| THE_DATE | IS_WORKDAY | WORKDAYS_CUMUL |
| 2019-01-01 00:00:00 | 77 | 77 |
| 2019-01-02 00:00:00 | 77 | 154 |
| 2019-01-03 00:00:00 | 77 | 231 |
...
Я думал, что это будет примерно так:
sum(x.is_workday)
- сделать сумму по 77
-значениям partition by x.the_date
- сделать окна / секции / детали по одной строке в каждом (в моем случае) order by x.the_date asc
- упорядочить эти строки по дате rows between unbounded preceding
- сумма между самой первой строкой... and current row
- ... и текущая строка.
Чего мне здесь не хватает?