Я пытаюсь вычислить значение и промежуточную сумму значения, которые зависят от самой промежуточной суммы. Промежуточный итог должен суммировать последние четыре значения, если промежуточный итог меньше или равен 3. Если промежуточный итог больше 3, то четвертое добавляемое значение должно быть уменьшено на [running_total - 3]. Если значение должно было быть уменьшено, то последующие промежуточные итоги должны учитывать уменьшенное значение вместо исходного значения.
Любые идеи о том, как решить эту проблему в Oracle SQL?
Пример
С учетом следующих данных:
create table val_table (id number, val number);
insert into val_table values (1, 0);
insert into val_table values (2, 2);
insert into val_table values (3, 0);
insert into val_table values (4, 0);
insert into val_table values (5, 2);
insert into val_table values (6, 0);
insert into val_table values (7, 3);
insert into val_table values (8, 0);
insert into val_table values (9, 3);
insert into val_table values (10,0);
commit;
Обычная общая сумма
select id
,val
,sum(val) over (order by id rows between 3 preceding and current row) as running_total
from val_table
);
выходы
============================
| ID | VAL | RUNNING_TOTAL |
|--------------------------|
| 1 | 0 | 0 |
| 2 | 2 | 2 |
| 3 | 0 | 2 |
| 4 | 0 | 2 |
| 5 | 2 | 4 |
| 6 | 0 | 2 |
| 7 | 3 | 5 |
| 8 | 0 | 5 |
| 9 | 3 | 6 |
| 10 | 0 | 6 |
============================
Требуемые откорректированные значения и откорректированные итоги работы:
====================================================
| ID | VAL | VAL_ADJUSTED | RUNNING_TOTAL_ADJUSTED |
|--------------------------------------------------|
| 1 | 0 | 0 | 0 |
| 2 | 2 | 2 | 2 |
| 3 | 0 | 0 | 2 |
| 4 | 0 | 0 | 2 |
| 5 | 2 | 1 | 3 |
| 6 | 0 | 0 | 1 |
| 7 | 3 | 2 | 3 |
| 8 | 0 | 0 | 3 |
| 9 | 3 | 1 | 3 |
| 10 | 0 | 0 | 3 |
====================================================
Обратите внимание, что откорректированное значение ID = 7 приводит к 2. Откорректированное итоговое значение при ID = 7 будет 0 + 1 + 0 + 3 = 4, что больше 3. Следовательно, значение ID = 7 должно быть уменьшено на 1, в результате чего скорректированное значение равно 2.
Пример 2
С учетом следующих данных:
create table val_table2 (id number, val number);
insert into val_table2 values (1, 2);
insert into val_table2 values (2, 2);
insert into val_table2 values (3, 2);
insert into val_table2 values (4, 2);
insert into val_table2 values (5, 2);
commit;
Требуемые откорректированные значения и откорректированные итоги работы являются
====================================================
| ID | VAL | VAL_ADJUSTED | RUNNING_TOTAL_ADJUSTED |
|--------------------------------------------------|
| 1 | 2 | 2 | 2 |
| 2 | 2 | 1 | 3 |
| 3 | 2 | 0 | 3 |
| 4 | 2 | 0 | 3 |
| 5 | 2 | 2 | 3 |
====================================================