Вы можете рассчитать оставшиеся часы, вычитая сумму часов до текущей строки (включая , а не 1 предшествующую) и включая ее, из общей суммы всех часов для проекта.
Я добавил разделение по идентификатору проекта, так что это будет работать и без фильтра идентификаторов, и, поскольку окно теперь соответствует стандартному (строки между неограниченной предшествующей и текущей строкой), я пропустил это предложение. Этот пример включает в себя общее и полное количество часов, чтобы прояснить ситуацию - они не нужны в вашем реальном запросе.
SELECT project_id,
sprint_id,
est_task_per_sprint as hours,
start_date,
end_date,
sum(est_task_per_sprint) over (partition by project_id) as total,
coalesce(sum(est_task_per_sprint)
over (partition by project_id order by end_date), 0) as completed,
sum(est_task_per_sprint) over (partition by project_id)
- coalesce(sum(est_task_per_sprint)
over (partition by project_id order by end_date), 0) as remaining
FROM project_sprint
--WHERE project_id=1
ORDER BY project_id, start_date;
PROJECT_ID SPRINT_ID HOURS START_DATE END_DATE TOTAL COMPLETED REMAINING
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1 1 262 2019-01-01 2019-01-31 1314 262 1052
1 11 263 2019-02-01 2019-02-28 1314 525 789
1 21 266 2019-03-01 2019-03-31 1314 791 523
1 31 262 2019-04-01 2019-04-30 1314 1053 261
1 41 261 2019-05-01 2019-05-31 1314 1314 0
- это то же самое, что и суммирование позже строк, на этот раз с использованием предложения окна строк от 1 до неограниченного числа:
SELECT project_id,
sprint_id,
est_task_per_sprint as hours,
start_date,
end_date,
coalesce(sum(est_task_per_sprint)
over (partition by project_id order by end_date
rows between 1 following and unbounded following), 0) as remaining
FROM project_sprint
--WHERE project_id=1
ORDER BY project_id, start_date;
PROJECT_ID SPRINT_ID HOURS START_DATE END_DATE REMAINING
---------- ---------- ---------- ---------- ---------- ----------
1 1 262 2019-01-01 2019-01-31 1052
1 11 263 2019-02-01 2019-02-28 789
1 21 266 2019-03-01 2019-03-31 523
1 31 262 2019-04-01 2019-04-30 261
1 41 261 2019-05-01 2019-05-31 0
дб <> скрипка
Обратите внимание, что числа не совсем соответствуют вашему ожидаемому результату, но это потому, что я считаю, что ваши ожидания были не совсем верными, и основывались на числах, полученных вашим запросом - просто поменять их местами не имеет смысла.