在本教程中,将学习如何使用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()
函数返回结果集的有序分区中的最后一个值。