Всегда ли нужно использовать UNBOUNDED FOLLOWING с аналитической функцией LAST_VALUE?
Всегда ли нужно использовать UNBOUNDED FOLLOWING с аналитической функцией LAST_VALUE?
Нашел пример, где без этой клаузы:
CREATE TABLE t (val) as
SELECT level FROM dual CONNECT BY level<=3;
SELECT
LAST_VALUE (val) OVER (ORDER BY val ASC) lastval
FROM t;
LASTVAL
----------
1
2
3
Не дало ожидаемого результата, который должен был быть - выводить в каждой строке последнее значение.
Поэтому, нужно было использовать оконную клаузу.
SELECT
LAST_VALUE (val) OVER (ORDER BY val ASC
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) lastval
FROM t;
LASTVAL
----------
3
3
3
Поэтому стало интересно, нужно ли всегда с LAST_VALUE использовать оконную клаузу?
Свободный перевод вопроса Do we always need to use UNBOUNDED FOLLOWING while using last_value() function? от участника @Abhilekh Dixit
Ответы (1 шт):
В общем случае ответ - да, надо использовать оконную клаузу (windowing_clause).
Потому что окно по умолчанию - это диапазон между неограниченной предыдущей и текущей строкой:
If you omit the windowing_clause entirely, then the default is
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
А последнее значение как раз и находится в текущей строке.
Исключением является случай, когда используется IGNORE NULLS, тогда оставить клаузу по умолчанию весьма полезно для получения последнего значения включая текущую, с не NULL значением. Например, как в этом ответе.
Кстати, именно по этой причине многие обычно используют FIRST_VALUE() с обратной сортировкой:
select first_value (val) over (order by val DESC) lastval
from t;
LASTVAL
----------
3
3
3
Как в данном случае, то проще использовать MAX:
select max (val) over () lastval
from t;
Свободный перевод ответа от участника @Gordon Linoff