在本教學中,將學習如何使用SQL Server LAST_VALUE()
函數獲取結果集的有序分區中的最後一個值。
SQL Server LAST_VALUE()函數簡介
LAST_VALUE()
函數是一個Window函數,它返回結果集的有序分區中的最後一個值。
以下是LAST_VALUE()
函數的語法:
LAST_VALUE ( scalar_expression )
OVER (
[PARTITION BY partition_expression, ... ]
ORDER BY sort_expression [ASC | DESC], ...
[rows_range_clause]
)
在上面語法中,
scalar_expression
是針對結果集的有序分區中最後一行的值計算的運算式。scalar_expression
可以是列,子查詢或運算式,其求值為單個值。它不能是一個Window函數。PARTITION BY
子句將結果集的行分發到應用了LAST_VALUE()
函數的分區。 如果未指定PARTITION BY
子句,則LAST_VALUE()
函數會將整個結果集視為單個分區。ORDER BY
子句指定應用LAST_VALUE()
函數的每個分區中行的邏輯順序。rows_range_clause
通過定義起點和終點進一步限制分區內的行。
SQL Server LAST_VALUE()函數示例
下麵將使用在FIRST_VALUE()
函數教學中創建的sales.vw_category_sales_volume
視圖來演示LAST_VALUE()
函數的工作原理。
以下查詢從視圖返回數據:
SELECT
category_name,
year,
qty
FROM
sales.vw_category_sales_volume
ORDER BY
year,
category_name,
qty;
執行上面查詢語句,得到以下結果:
1. 使用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
)從低到高對每個分區中的行進行排序。UNBOUNDED PRECEDING
和UNBOUNDED FOLLOWING
子句之間的範圍定義了從第一行開始到最後一行結束的分區中的幀。
2. 在分區上使用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
)從低到高對每個分區中的行進行排序。UNBOUNDED PRECEDING
和UNBOUNDED FOLLOWING
子句之間的範圍定義從第一行開始到結束於分區的最後一行的幀。LAST_VALUE()
函數分別應用於每個分區。 對於第一個分區,它返回Electric Bikes
;對於第二個分區,它返回了Comfort Bicycles
,因為這些類別是每個分區中的最後一行。
在本教學中,學習了如何使用SQL Server LAST_VALUE()
函數返回結果集的有序分區中的最後一個值。
上一篇:
SQL Server Window函數
下一篇:無