在本教程中,将学习如何使用SQL Server FIRST_VALUE()
函数获取结果集的有序分区中的第一个值。
SQL Server FIRST_VALUE()函数简介
FIRST_VALUE()
函数是一个窗口函数,它返回结果集的有序分区中的第一个值。
以下是FIRST_VALUE()
函数的语法:
FIRST_VALUE ( scalar_expression )
OVER (
[PARTITION BY partition_expression, ... ]
ORDER BY sort_expression [ASC | DESC], ...
[rows_range_clause]
)
在上面语法中,
scalar_expression
是针对结果集的有序分区的第一行的值计算的表达式。scalar_expression
可以是计算为单个值的列,子查询或表达式。它不能是一个Window函数。PARTITION BY
子句将结果集的行分配到应用FIRST_VALUE()
函数的分区中。 如果不使用PARTITION BY
子句,FIRST_VALUE()
函数会将整个结果集视为单个分区。ORDER BY
子句指定应用FIRST_VALUE()
函数的每个分区中行的逻辑顺序。rows_range_clause
通过定义起点和终点进一步限制分区内的行。
SQL Server FIRST_VALUE()函数示例
以下语句创建名为sales.vw_category_sales_volume
的新视图,该视图返回按产品类别和年份销售的产品数。
CREATE VIEW
sales.vw_category_sales_volume
AS
SELECT
category_name,
YEAR(order_date) year,
SUM(quantity) qty
FROM
sales.orders o
INNER JOIN sales.order_items i
ON i.order_id = o.order_id
INNER JOIN production.products p
ON p.product_id = i.product_id
INNER JOIN production.categories c
ON c.category_id = p.product_id
GROUP BY
category_name,
YEAR(order_date);
接下来,查询视图中的数据 -
SELECT
*
FROM
sales.vw_category_sales_volume
ORDER BY
year,
category_name,
qty;
执行上面查询语句,得到以下结果:
1. FIRST_VALUE()使用结果集示例
此示例使用FIRST_VALUE()
函数返回2017
年销售量最低的类别名称:
SELECT
category_name,
year,
qty,
FIRST_VALUE(category_name) OVER(
ORDER BY qty
) lowest_sales_volume
FROM
sales.vw_category_sales_volume
WHERE
year = 2017;
执行上面查询语句,得到以下结果:
在这个例子中:
- 未指定
PARTITION BY
子句,因此整个结果集被视为单个分区。 ORDER BY
子句按数量(qty
)从低到高对每个分区中的行进行排序。
2. FIRST_VALUE()在分区上使用示例
以下示例使用FIRST_VALUE()
函数返回2016年和2017年销售量最低的产品类别。
SELECT
category_name,
year,
qty,
FIRST_VALUE(category_name) OVER(
`PARTITION BY` year
ORDER BY qty
) lowest_sales_volume
FROM
sales.vw_category_sales_volume
WHERE
year BETWEEN 2016 AND 2017;
执行上面查询语句,得到以下结果:
在这个例子中:
PARTITION BY
子句按年分配行分为两个分区,一个用于2016
,另一个用于2017
。ORDER BY
子句按数量(qty
)从低到高对每个分区中的行进行排序。FIRST_VALUE()
函数分别应用于每个分区。 对于第一个分区,它返回Electric Bikes
,对于第二个分区,它返回了Comfort Bicycles
,因为这些类别是每个分区中的第一行。
在本教程中,学习了如何使用SQL Server FIRST_VALUE()
函数返回结果集的有序分区中的第一个值。