FIRST_VALUE (Transact-SQL)

Область применения: sql Server База данных SQL Azure Управляемый экземпляр SQL Azure конечную точку аналитики Azure Synapse Analytics Analytics Platform System (PDW) Azure SQL Edge SQL Analytics в Microsoft Fabric Хранилище в Microsoft Fabric

Возвращает первое значение в упорядоченном наборе значений.

Соглашения о синтаксисе Transact-SQL

Синтаксис

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 (начиная с SQL Server 2022 (16.x)), База данных SQL Azure, Управляемый экземпляр SQL Azure, 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 не детерминирована. Дополнительные сведения см. в разделе детерминированные и недетерминированные функции.

Примеры

А. Использование 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