LAST_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 último valor de un conjunto ordenado de valores.

Convenciones de sintaxis de Transact-SQL

Sintaxis

LAST_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 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 último valor en una partición.

RESPECT NULLS : se respetan los valores NULL del conjunto de datos al calcular el último 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 de los datos antes de que se aplique la funció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

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

Ejemplos

A. Uso de LAST_VALUE en particiones

En el ejemplo siguiente se devuelve la fecha de contratación del último empleado de cada departamento con el sueldo especificado (Rate). La cláusula PARTITION BY divide los empleados por departamento y la función LAST_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 LAST_VALUE a las filas de cada partición.

USE AdventureWorks2022;
GO

SELECT Department,
    LastName,
    Rate,
    HireDate,
    LAST_VALUE(HireDate) OVER (
        PARTITION BY Department ORDER BY Rate
    ) AS LastValue
FROM HumanResources.vEmployeeDepartmentHistory AS edh
INNER JOIN HumanResources.EmployeePayHistory AS eph
    ON eph.BusinessEntityID = edh.BusinessEntityID
INNER JOIN HumanResources.Employee AS e
    ON e.BusinessEntityID = edh.BusinessEntityID
WHERE Department IN (N'Information Services', N'Document Control');

El conjunto de resultados es el siguiente:

Department                  LastName                Rate         HireDate     LastValue
--------------------------- ----------------------- ------------ ----------   ----------
Document Control            Chai                    10.25        2003-02-23   2003-03-13
Document Control            Berge                   10.25        2003-03-13   2003-03-13
Document Control            Norred                  16.8269      2003-04-07   2003-01-17
Document Control            Kharatishvili           16.8269      2003-01-17   2003-01-17
Document Control            Arifin                  17.7885      2003-02-05   2003-02-05
Information Services        Berg                    27.4038      2003-03-20   2003-01-24
Information Services        Meyyappan               27.4038      2003-03-07   2003-01-24
Information Services        Bacon                   27.4038      2003-02-12   2003-01-24
Information Services        Bueno                   27.4038      2003-01-24   2003-01-24
Information Services        Sharma                  32.4519      2003-01-05   2003-03-27
Information Services        Connelly                32.4519      2003-03-27   2003-03-27
Information Services        Ajenstat                38.4615      2003-02-18   2003-02-23
Information Services        Wilson                  38.4615      2003-02-23   2003-02-23
Information Services        Conroy                  39.6635      2003-03-08   2003-03-08
Information Services        Trenary                 50.4808      2003-01-12   2003-01-12

B. Uso de FIRST_VALUE y LAST_VALUE en una expresión calculada

En el ejemplo siguiente se usan las funciones FIRST_VALUE y LAST_VALUE en expresiones calculadas para mostrar las diferencias entre los valores de cuota de ventas del trimestre actual y el primer y el último trimestre del año respectivamente con respecto a un número determinado de empleados. La función FIRST_VALUE devuelve el valor de la cuota de ventas del primer trimestre del año y la resta del valor de la cuota de ventas del trimestre actual. Devuelve la columna derivada titulada DifferenceFromFirstQuarter. Para el primer trimestre de un año, el valor de la columna DifferenceFromFirstQuarter es 0. La función LAST_VALUE devuelve el valor de cuota de ventas para el último trimestre del año y lo resta del valor de la cuota de ventas del trimestre actual. Devuelve en la columna derivada titulada DifferenceFromLastQuarter. Para el último trimestre de un año, el valor de la columna DifferenceFromLastQuarter es 0.

La cláusula RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING se requiere en este ejemplo para los valores distintos de cero que se devuelven en la columna DifferenceFromLastQuarter. El intervalo predeterminado es RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. En este ejemplo, el uso de ese intervalo predeterminado (o sin incluir un intervalo, lo que produce el valor predeterminado que se utiliza) daría lugar a que en la columna DifferenceFromLastQuarter se devolvieran ceros. Para más información, vea Cláusula OVER (Transact-SQL).

USE AdventureWorks2022;
GO

SELECT BusinessEntityID,
    DATEPART(QUARTER, QuotaDate) AS Quarter,
    YEAR(QuotaDate) AS SalesYear,
    SalesQuota AS QuotaThisQuarter,
    SalesQuota - FIRST_VALUE(SalesQuota) OVER (
        PARTITION BY BusinessEntityID,
        YEAR(QuotaDate) ORDER BY DATEPART(QUARTER, QuotaDate)
        ) AS DifferenceFromFirstQuarter,
    SalesQuota - LAST_VALUE(SalesQuota) OVER (
        PARTITION BY BusinessEntityID,
        YEAR(QuotaDate) ORDER BY DATEPART(QUARTER, QuotaDate) RANGE BETWEEN CURRENT ROW
                AND UNBOUNDED FOLLOWING
    ) AS DifferenceFromLastQuarter
FROM Sales.SalesPersonQuotaHistory
WHERE YEAR(QuotaDate) > 2005
    AND BusinessEntityID BETWEEN 274
        AND 275
ORDER BY BusinessEntityID,
    SalesYear,
    Quarter;

El conjunto de resultados es el siguiente:

BusinessEntityID Quarter     SalesYear   QuotaThisQuarter      DifferenceFromFirstQuarter DifferenceFromLastQuarter
---------------- ----------- ----------- --------------------- --------------------------- -----------------------
274              1           2006        91000.00              0.00                        -63000.00
274              2           2006        140000.00             49000.00                    -14000.00
274              3           2006        70000.00              -21000.00                   -84000.00
274              4           2006        154000.00             63000.00                    0.00
274              1           2007        107000.00             0.00                        -9000.00
274              2           2007        58000.00              -49000.00                   -58000.00
274              3           2007        263000.00             156000.00                   147000.00
274              4           2007        116000.00             9000.00                     0.00
274              1           2008        84000.00              0.00                        -103000.00
274              2           2008        187000.00             103000.00                   0.00
275              1           2006        502000.00             0.00                        -822000.00
275              2           2006        550000.00             48000.00                    -774000.00
275              3           2006        1429000.00            927000.00                   105000.00
275              4           2006        1324000.00            822000.00                   0.00
275              1           2007        729000.00             0.00                        -489000.00
275              2           2007        1194000.00            465000.00                   -24000.00
275              3           2007        1575000.00            846000.00                   357000.00
275              4           2007        1218000.00            489000.00                   0.00
275              1           2008        849000.00             0.00                        -20000.00
275              2           2008        869000.00             20000.00                    0.00