Недавно начала изучать аналитические функции, и вот возникла задача, которую, чувствую, можно решить с помощью них, но быстрого варианта не вижу :(.
Исходные данные:
with Test as (
select Trunc(sysdate - 6) as dDate, 100 as nQty from dual
union
select Trunc(sysdate - 5) as dDate, 200 as nQty from dual
union
select Trunc(sysdate - 7) as dDate, 140 as nQty from dual
union
select Trunc(sysdate - 4) as dDate, 150 as nQty from dual
union
select Trunc(sysdate - 3) as dDate, 200 as nQty from dual)
Имеем некое цифровое значение - например, 400.
Нужен результат, который дает такой запрос:
select t.*, (nQty + 400 - nQtyFull) as nQtyDiff
from (
select *
from (
select dDate
, nQty
, sum(nQty) over(order by dDate desc) as nQtyFull
from Test
)
where nQtyFull >= 400
order by dDate desc
) t
where rownum < 2
Но, насколько я понимаю, такой запрос при большом количестве записей в таблице Test будет тормозить, и очень прилично.
Как бы условие nQtyFull >= 400 учесть раньше, чем будет посчитан нарастающий итог по всей таблице? Да и вторая сортировка мне не импонирует :(