Рассчитать промежуточную сумму, используя неограниченное число - PullRequest
0 голосов
/ 22 мая 2019

Я работаю над написанием запроса, который даст количество часов, оставшихся на начальный день, и оно должно постепенно уменьшаться к концу дня и достигать нуля.

Я пытался использовать неограниченную предыдущую функцию.Это помогло, но не полностью.

SELECT project_id,
       sprint_id,
       est_task_per_sprint,
       start_date,end_date,
         nvl(sum(est_task_per_sprint) over (
           order by end_date rows between unbounded preceding and 1 preceding

       ),0) tot
FROM   project_sprint where project_id=1;

sum(est_task_per_sprint)=1134 - это общее количество часов.

Вывод, который я получил:

Proj  Sprint  Hours  startdate  enddate    hoursremaining
   1       1    262  01-JAN-19  31-JAN-19               0
   1      11    263  01-FEB-19  28-FEB-19             262
   1      21    266  01-MAR-19  31-MAR-19             525
   1      31    262  01-APR-19  30-APR-19             791
   1      41    261  01-MAY-19  31-MAY-19            1053

Ожидаемый:

Proj  Sprint  Hours  startdate  enddate    hoursremaining
   1       1    262  01-JAN-19  31-JAN-19            1053
   1      11    263  01-FEB-19  28-FEB-19             791
   1      21    266  01-MAR-19  31-MAR-19             525
   1      31    262  01-APR-19  30-APR-19             262
   1      41    261  01-MAY-19  31-MAY-19               0

1 Ответ

0 голосов
/ 22 мая 2019

Вы можете рассчитать оставшиеся часы, вычитая сумму часов до текущей строки (включая , а не 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

дб <> скрипка

Обратите внимание, что числа не совсем соответствуют вашему ожидаемому результату, но это потому, что я считаю, что ваши ожидания были не совсем верными, и основывались на числах, полученных вашим запросом - просто поменять их местами не имеет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...