Ответ 1
Основываясь на пояснениях ОП через комментарии по этому вопросу, это можно сделать, используя аналитическую функцию SUM(), чтобы получить текущую общую сумму, а затем отфильтровать ее на основе состояние.
Таблица:
SQL> SELECT * FROM t;
ID_PRIM ID DT MOVED
---------- ----- --------- ----------
1003 12_1 01-NOV-13 2
1003 12_2 01-OCT-13 3
1003 12_3 01-DEC-14 5
1003 12_4 01-FEB-15 10
1003 12_5 01-APR-12 1
1003 12_11 01-JAN-11 5
6 rows selected.
SQL>
Общее количество
SQL> SELECT t.*, SUM(moved) OVER(ORDER BY dt) sm FROM t ORDER BY dt DESC;
ID_PRIM ID DT MOVED SM
---------- ----- --------- ---------- ----------
1003 12_4 01-FEB-15 10 26
1003 12_3 01-DEC-14 5 16
1003 12_1 01-NOV-13 2 11
1003 12_2 01-OCT-13 3 9
1003 12_5 01-APR-12 1 6
1003 12_11 01-JAN-11 5 5
6 rows selected.
SQL>
Желаемый вывод
SQL> WITH DATA AS
2 ( SELECT t.*, SUM(moved) OVER(ORDER BY dt) sm FROM t ORDER BY dt DESC
3 )
4 SELECT * FROM data WHERE sm >= 16;
ID_PRIM ID DT MOVED SM
---------- ----- --------- ---------- ----------
1003 12_4 01-FEB-15 10 26
1003 12_3 01-DEC-14 5 16
SQL>
Обратите внимание, что nov 2013
не является датой, это строка . Поскольку вы хотите сортировать по дате, вы всегда должны использовать TO_DATE, чтобы явно преобразовать его в дату. Во всяком случае, я использовал TO_DATE для создания данных образца.
Обновить OP хочет вычесть нужное значение из значения MAX суммированных значений во время выполнения.
SQL> WITH DATA AS
2 ( SELECT t.*, SUM(moved) OVER(ORDER BY dt) sm FROM t ORDER BY dt DESC
3 )
4 SELECT * FROM DATA t WHERE sm >
5 (SELECT MAX(sm) FROM data
6 ) - 16 ;
ID_PRIM ID DT MOVED SM
---------- ----- --------- ---------- ----------
1003 12_4 01-FEB-15 10 26
1003 12_3 01-DEC-14 5 16
1003 12_1 01-NOV-13 2 11
SQL>
В обновленном запросе MAX (sm) возвращает 26
, а затем строки фильтруются в условии WHERE sm > MAX(sm) -16
, что означает возврат всех строк, где значение "sm" больше чем 26 -16
т.е. 10
. Вы можете использовать переменную подстановки , чтобы ввести значение 16
во время выполнения.