在本教學中,將學習如何使用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()
函數返回結果集的有序分區中的第一個值。
上一篇:
SQL Server Window函數
下一篇:無