SQL Сервер LAST_VALUE и LEAD - PullRequest
       5

SQL Сервер LAST_VALUE и LEAD

0 голосов
/ 17 апреля 2020

Как показано здесь , для функции LAST_VALUE в SQL на сервере должен быть указан указанный кадр (например, ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING), иначе по умолчанию будет первая строка в текущей строке. Это, похоже, не относится к LEAD. Обе функции являются «ориентированными на будущее», так есть ли какая-либо задокументированная причина того, что кажется несоответствием?

Все работает, как и ожидалось, я просто пытаюсь получить более solid понимание функциональности, которую я использовал годами.

1 Ответ

2 голосов
/ 17 апреля 2020

Рамка окна по умолчанию для LAST_VALUE равна RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, поэтому, если вы хотите, чтобы все строки были включены, вам нужно использовать указанное окно, т. Е. Это задокументировано в LAST_VALUE (Transact- SQL) - Использование FIRST_VALUE и LAST_VALUE в вычисленном выражении :

Требуется пункт «ДИАПАЗОН МЕЖДУ ТЕКУЩЕЙ СТРОКОЙ И НЕ ПОДКЛЮЧЕННЫМ СЛЕДУЮЩИМ» в этом примере ненулевые значения должны быть возвращены в столбце DifferenceFromLastQuarter, как показано ниже. Диапазон по умолчанию - «ДИАПАЗОН МЕЖДУ НЕПРЕДУСМОТРЕННЫМ ПРЕЦЕДИРОВАНИЕМ И ТЕКУЩЕЙ СТРОКОЙ».

В результате без ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING вы получите текущую строку с LAST_VALUE, поскольку это последняя строка в рамка окна по умолчанию.

LEAD, с другой стороны, не использует ROWS или RANGE BETWEEN, поэтому имеет доступ ко всей области набора данных. Попытка использовать ROWS BETWEEN приведет к ошибке:

SELECT V.I,
       LEAD(V.I) OVER (ORDER BY V.I ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) AS L
FROM (VALUES(1),(2),(3))V(I);

Функция 'LEAD' может не иметь рамки окна.

...