FIRST_VALUE (Transact-SQL)
適用於:Microsoft Fabric Microsoft網狀架構倉儲中的 SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Platform System (PDW) Azure SQL Edge SQL 分析端點
傳回已排序值集中的第一個值。
語法
FIRST_VALUE ( [ scalar_expression ] ) [ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
引數
scalar_expression
要傳回的值。 scalar_expression 可以是資料行、子查詢,或其他結果為單一值的任意運算式。 不允許使用其他分析函數。
[ 忽略 Null | 尊重 Null ]
適用於:SQL Server 2022 (16.x) 和更新版本、Azure SQL Database、Azure SQL 受控實例和 Azure SQL Edge
IGNORE NULLS
- 在計算分割區上的第一個值時,忽略數據集中的 Null 值。
RESPECT NULLS
- 在計算分割區上的第一個值時,尊重數據集中的 Null 值。
RESPECT NULLS
如果未指定 NULLS 選項,則為預設行為。
如需 Azure SQL Edge 中這個自變數的詳細資訊,請參閱 插補遺漏值。
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
partition_by_clause 會將 FROM 子句產生的結果集分割成函式所要套用的分割區。 如未指定,此函數會將查詢結果集的所有資料列視為單一群組。
order_by_clause 決定執行作業的邏輯順序。 order_by_clause 為必要項目。
rows_range_clause 會指定起始點及結束點,以進一步限制分割區中的資料列數。
如需詳細資訊,請參閱 OVER 子句 (Transact-SQL)。
傳回類型
與 scalar_expression 相同的類型。
備註
FIRST_VALUE
不具決定性。 如需詳細資訊,請參閱決定性與非決定性函數。
範例
A. 針對查詢結果集使用 FIRST_VALUE
下列範例使用 FIRST_VALUE
傳回給定產品類別目錄中最便宜產品的名稱。
USE AdventureWorks2022;
GO
SELECT Name,
ListPrice,
FIRST_VALUE(Name) OVER (
ORDER BY ListPrice ASC
) AS LeastExpensive
FROM Production.Product
WHERE ProductSubcategoryID = 37;
結果集如下所示。
Name ListPrice LeastExpensive
----------------------- --------------------- --------------------
Patch Kit/8 Patches 2.29 Patch Kit/8 Patches
Road Tire Tube 3.99 Patch Kit/8 Patches
Touring Tire Tube 4.99 Patch Kit/8 Patches
Mountain Tire Tube 4.99 Patch Kit/8 Patches
LL Road Tire 21.49 Patch Kit/8 Patches
ML Road Tire 24.99 Patch Kit/8 Patches
LL Mountain Tire 24.99 Patch Kit/8 Patches
Touring Tire 28.99 Patch Kit/8 Patches
ML Mountain Tire 29.99 Patch Kit/8 Patches
HL Road Tire 32.60 Patch Kit/8 Patches
HL Mountain Tire 35.00 Patch Kit/8 Patches
B. 針對分割區使用 FIRST_VALUE
下列範例使用 FIRST_VALUE
傳回相同職稱的員工中,休假時數最少的員工。
PARTITION BY
子句會依職稱分割員工,而 FIRST_VALUE
函數則會個別套用至每個分割區。
ORDER BY
子句中指定的 OVER
子句,可決定每個分割區中的資料列套用 FIRST_VALUE
函數的邏輯順序。
ROWS UNBOUNDED PRECEDING
子句會將視窗起點指定為每個分割區的第一個資料列。
USE AdventureWorks2022;
GO
SELECT JobTitle,
LastName,
VacationHours,
FIRST_VALUE(LastName) OVER (
PARTITION BY JobTitle ORDER BY VacationHours ASC ROWS UNBOUNDED PRECEDING
) AS FewestVacationHours
FROM HumanResources.Employee AS e
INNER JOIN Person.Person AS p
ON e.BusinessEntityID = p.BusinessEntityID
ORDER BY JobTitle;
結果集如下所示。
JobTitle LastName VacationHours FewestVacationHours
----------------------------------- ------------------------- ------------- -------------------
Accountant Moreland 58 Moreland
Accountant Seamans 59 Moreland
Accounts Manager Liu 57 Liu
Accounts Payable Specialist Tomic 63 Tomic
Accounts Payable Specialist Sheperdigian 64 Tomic
Accounts Receivable Specialist Poe 60 Poe
Accounts Receivable Specialist Spoon 61 Poe
Accounts Receivable Specialist Walton 62 Poe