Из документации :
Аналитические функции вычисляют совокупное значение на основе группы строк. Они отличаются от агрегатных функций тем, что возвращают несколько строк для каждой группы. Группа строк называется окном ...
и
ROWS
| RANGE
Эти ключевые слова определяют для каждой строки окно (физический или логический набор строк), используемое для вычисления результата функции. Затем функция применяется ко всем строкам в окне. Окно перемещается по результирующему набору результатов или разделу сверху вниз.
...
value_expr PRECEDING
или value_expr FOLLOWING
Для RANGE or
ROW`:
Если value_expr FOLLOWING
является начальной точкой, тогда конечная точка должна быть value_expr FOLLOWING
.
Если value_expr PRECEDING
является конечной точкой, тогда начальная точка должна быть value_expr PRECEDING
.
В каждом из ваших предложений используется один и тот же value_expr как для предыдущего, так и для следующего, поэтому окно ограничено ровно 1 строкой; оглядываясь назад, 7 рядов для первого, 6 рядов для второго и т. д.
Как демонстрация того, что это генерирует:
with t (id, dt) as (
select level, date '2018-01-01' + (level * 3)
from dual
connect by level <= 10
)
select id, dt,
min(id) over (order by dt rows between 7 preceding and 7 preceding) as a,
min(id) over (order by dt rows between 6 preceding and 6 preceding) as b,
min(id) over (order by dt rows between 5 preceding and 5 preceding) as c
from t
order by dt;
ID DT A B C
---------- ---------- ---------- ---------- ----------
1 2018-01-04
2 2018-01-07
3 2018-01-10
4 2018-01-13
5 2018-01-16
6 2018-01-19 1
7 2018-01-22 1 2
8 2018-01-25 1 2 3
9 2018-01-28 2 3 4
10 2018-01-31 3 4 5
Сгенерированные столбцы a, b и c оглядываются назад на 7, 6 и 5 строк соответственно, чтобы найти значение для использования. Если нет подходящей строки в далеком прошлом, результат будет нулевым.
Также обратите внимание, что аналитическое предложение упорядочено по значению даты, и эти даты не являются смежными - но возвращаются идентификаторы. Это потому, что он смотрит на строки в этом порядке, а не на реальные значения, которые они содержат. Если вы использовали вместо этого окно диапазона:
select id, dt,
min(id) over (order by dt range between 7 preceding and 7 preceding) as a,
min(id) over (order by dt range between 6 preceding and 6 preceding) as b,
min(id) over (order by dt range between 5 preceding and 5 preceding) as c
from t
order by dt;
ID DT A B C
---------- ---------- ---------- ---------- ----------
1 2018-01-04
2 2018-01-07
3 2018-01-10 1
4 2018-01-13 2
5 2018-01-16 3
6 2018-01-19 4
7 2018-01-22 5
8 2018-01-25 6
9 2018-01-28 7
10 2018-01-31 8
... результаты будут сильно отличаться, и вы увидите только идентификаторы с датой значения 5, 6 и 7 дней назад - и, как я сделал все пропуски 3 дня в CTE , есть только совпадения в столбце результата b
. Ни у одного из рядов нет ничего за 5 или 7 дней до этого, у них есть только ряды за 6 дней до этого (как мультипель из 3), и первые несколько рядов до сих пор не имеют совпадений в далеком прошлом. Если вы продлили это до 3-х дней до этого, вы увидите совпадения и для них.