Share via


FIRST_VALUE (Transact-SQL)

傳回 SQL Server 2012 中排序值集的第一個值。

主題連結圖示 Transact-SQL 語法慣例

語法

FIRST_VALUE ( [scalar_expression ] ) 
    OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )

引數

  • scalar_expression
    要傳回的值。 scalar_expression 可以是結果為單一值的資料行、子查詢或其他任意的運算式。 不允許其他分析函數。

  • 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 相同的類型。

範例

A.針對查詢結果集使用 FIRST_VALUE

下列範例使用 FIRST_VALUE 傳回某一產品類別目錄中最便宜的產品名稱。

USE AdventureWorks2012;
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 函數會個別套用至每個資料分割。 OVER 子句中指定的 ORDER BY 子句,可決定 FIRST_VALUE 函數套用至每個資料分割中之資料列的邏輯順序。 ROWS UNBOUNDED PRECEDING 子句會將視窗起點指定為每個資料分割的第一列。

USE AdventureWorks2012; 
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

請參閱

參考

OVER 子句 (Transact-SQL)