Аналитические функции все еще работают с наборами данных.Они не обрабатывают по одной строке за раз, для этого вам понадобится PL / SQL или MODEL.PRECEDING
относится к последним X строкам, но до применения аналитической функции.
Эти проблемы могут сбивать с толку в SQL, поскольку вам нужно встроить логику в определение набора, а не пытаться передавать данныеиз одного ряда в другой.Вот почему я использовал CASE
с LAST_VALUE
в своем предыдущем ответе .
Редактировать:
Я добавилпростой набор данных, чтобы мы могли выполнить один и тот же запрос.VALUE1
мне кажется работает, я что-то упустил?Часть проблемы с VALUE2
заключается в том, что аналитическая ORDER BY использует VALUE вместо даты.
select id, the_date, value
,last_value(value ignore nulls) over
(partition by id order by the_date) value1
,nvl(value, LAST_VALUE(value IGNORE NULLS) over
(order by value RANGE BETWEEN 1 PRECEDING AND CURRENT ROW)) value2
from
(
select 1 id, date '2011-01-01' the_date, 100 value from dual union all
select 1 id, date '2011-01-02' the_date, null value from dual union all
select 1 id, date '2011-01-03' the_date, null value from dual union all
select 1 id, date '2011-01-04' the_date, null value from dual union all
select 1 id, date '2011-01-05' the_date, 200 value from dual
)
order by the_date;
Результаты:
ID THE_DATE VALUE VALUE1 VALUE2
1 1/1/2011 100 100 100
1 1/2/2011 100
1 1/3/2011 100
1 1/4/2011 100
1 1/5/2011 200 200 200