FIRST_VALUE (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW) Azure SQL Edge Punto de conexión de análisis SQL en Microsoft FabricAlmacenamiento en Microsoft Fabric

Devuelve el primer valor de un conjunto ordenado de valores.

Convenciones de sintaxis de Transact-SQL

Sintaxis

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

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.

Argumentos

scalar_expression

Valor que se va a devolver. scalar_expression puede ser una columna, una subconsulta u otra expresión arbitraria que dé como resultado un solo valor. No se permiten otras funciones analíticas.

[ IGNORE NULLS | RESPECT NULLS ]

Se aplica a: SQL Server (a partir de SQL Server 2022 [16.x]), Azure SQL Database, Azure SQL Managed Instance y Azure SQL Edge

IGNORE NULLS : se omiten los valores NULL del conjunto de datos al calcular el primer valor en una partición.

RESPECT NULLS : respeta los valores NULL del conjunto de datos al calcular el primer valor en una partición. RESPECT NULLS es el comportamiento predeterminado si no se especifica una opción NULLS.

Para más información sobre este argumento en Azure SQL Edge, consulte Imputación de valores que faltan.

OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )

partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como un único grupo.

order_by_clause determina el orden lógico en el que se realiza la operación. order_by_clause es obligatorio.

rows_range_clause limita aún más las filas de la partición, ya que especifica puntos de inicio y final.

Para más información, vea Cláusula OVER (Transact-SQL).

Tipos de valores devueltos

El mismo tipo que scalar_expression.

Observaciones

FIRST_VALUE sea no determinista. Para más información, vea Funciones deterministas y no deterministas.

Ejemplos

A. Usar FIRST_VALUE sobre un conjunto de resultados de consulta

En el ejemplo siguiente se usa FIRST_VALUE para devolver el nombre del producto menos costoso de una categoría de productos determinada.

USE AdventureWorks2022;
GO

SELECT Name,
    ListPrice,
    FIRST_VALUE(Name) OVER (
        ORDER BY ListPrice ASC
    ) AS LeastExpensive
FROM Production.Product
WHERE ProductSubcategoryID = 37;

El conjunto de resultados es el siguiente:

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. Usar FIRST_VALUE en particiones

En el ejemplo siguiente se usa FIRST_VALUE para devolver el empleado con el menor número de horas de vacaciones en comparación con otros empleados del mismo puesto. La cláusula PARTITION BY divide los empleados por puesto y la función FIRST_VALUE se aplica a cada partición de forma independiente. La cláusula ORDER BY especificada en la cláusula OVER determina el orden lógico en el que se aplica la función FIRST_VALUE a las filas de cada partición. La cláusula ROWS UNBOUNDED PRECEDING especifica que el punto inicial de la ventana es la primera fila de cada partición.

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;

El conjunto de resultados es el siguiente:

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