FIRST_VALUE (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Azure SQL Edge Microsoft Fabric 中的 SQL 分析端点Microsoft Fabric 中的仓库

返回有序值集中的第一个值。

Transact-SQL 语法约定

语法

FIRST_VALUE ( [ scalar_expression ] ) [ IGNORE NULLS | RESPECT NULLS ]
    OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

自变量

scalar_expression

要返回的值。 scalar_expression 可以是产生单个值的列、子查询或其他任意表达式。 不允许使用其他分析函数。

[ IGNORE NULLS | RESPECT NULLS ]

适用范围:SQL Server(SQL Server 2022 (16.x) 及更高版本)、Azure SQL 数据库、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 函数独立应用于每个分区。 在 OVER 子句中指定的 ORDER BY 子句确定对每个分区中的行应用 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