FIRST_VALUE (Transact-SQL)
适用于:sql Server Azure SQL 数据库 Azure SQL 托管实例 azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric Warehouse 中的 azure SQL Edge SQL Analytics 终结点(Microsoft Fabric)
返回有序值集中的第一个值。
语法
FIRST_VALUE ( [ scalar_expression ] ) [ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
参数
scalar_expression
要返回的值。 scalar_expression 可以是产生单个值的列、子查询或其他任意表达式。 不允许使用其他分析函数。
[ IGNORE NULLS | RESPECT NULLS ]
适用于: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
函数独立应用于每个分区。 在 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