В этом руководстве вы узнаете, как использовать функцию SQL Server LAST_VALUE() для получения последнего значения в упорядоченном разделе результирующего набора.
Обзор функции SQL Server LAST_VALUE()
Функция LAST_VALUE() — это оконная функция, которая возвращает последнее значение в упорядоченном разделе результирующего набора.
Ниже показан синтаксис функции LAST_VALUE():
LAST_VALUE( scalar_expression )
OVER(
[PARTITION BY partition_expression, ... ]
ORDER BY sort_expression [ASC | DESC], ...
)
В этом синтаксисе:
скалярное_выражение
scalar_expression — это выражение, вычисляемое по значению последней строки в упорядоченном разделе набора результатов. scalar_expression может быть столбцом, подзапросом или выражением, вычисляющим одно значение. Оно не может быть оконной функцией.
РАЗДЕЛЕНИЕ ПО пункту
Предложение PARTITION BY распределяет строки результирующего набора по разделам, к которым применяется функция LAST_VALUE(). Если вы пропустите предложение PARTITION BY, функция LAST_VALUE() будет обрабатывать весь результирующий набор как один раздел.
Предложение ORDER BY
Предложение ORDER BY определяет логический порядок строк в каждом разделе, к которому применяется функция LAST_VALUE().
предложение_диапазона_строк
Предложение rows_range_clause дополнительно ограничивает строки в разделе, определяя начальную и конечную точки.
Примеры функции SQL Server LAST_VALUE()
Мы будем использовать представление sales.vw_category_sales_volume, созданное в руководстве по функции FIRST_VALUE(), чтобы продемонстрировать, как работает функция LAST_VALUE().
Следующий запрос возвращает данные из представления:
SELECT
category_name,
year,
qty
FROM
sales.vw_category_sales_volume
ORDER BY
year,
category_name,
qty;

A) Пример использования LAST_VALUE() в результирующем наборе
В этом примере функция LAST_VALUE() используется для возврата названия категории с наибольшим объемом продаж в 2016 году:
SELECT
category_name,
year,
qty,
LAST_VALUE(category_name) OVER(
ORDER BY qty
RANGE BETWEEN
UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING
) highest_sales_volume
FROM
sales.vw_category_sales_volume
WHERE
year = 2016;
Вот что получилось:

В этом примере:
- Предложение PARTITION BY не было указано, поэтому весь набор результатов рассматривался как один раздел.
- Предложение ORDER BY сортирует строки в каждом разделе по количеству(qty) от меньшего к большему.
- Предложение RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING определяет фрейм в разделе, начинающийся с первой строки и заканчивающийся последней строкой.
B) Пример использования LAST_VALUE() для разделов
В следующем примере функция LAST_VALUE() используется для возврата категорий продуктов с самыми высокими объемами продаж в 2016 и 2017 годах.
SELECT
category_name,
year,
qty,
LAST_VALUE(category_name) OVER(
PARTITION BY year
ORDER BY qty
RANGE BETWEEN
UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING
) highest_sales_volume
FROM
sales.vw_category_sales_volume
WHERE
year IN(2016,2017);
На следующем рисунке показан результат:

В этом примере:
- Предложение PARTITION BY распределило строки по годам на два раздела: один для 2016 года, а другой для 2017 года.
- Предложение ORDER BY сортирует строки в каждом разделе по количеству(qty) от меньшего к большему.
- Предложение RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING определяет фрейм, начинающийся с первой строки и заканчивающийся последней строкой раздела.
- Функция LAST_VALUE() была применена к каждому разделу отдельно. Для первого раздела она вернула Electric Bikes, а для второго раздела — Comfort Bicycles, поскольку эти категории были последними строками в каждом разделе.
В этом руководстве вы узнали, как использовать функцию SQL Server LAST_VALUE() для возврата последнего значения в упорядоченном разделе результирующего набора.


