Sdílet prostřednictvím


LAST_VALUE (Transact-SQL)

Platí na:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytický platformový systém (PDW) Azure SQL Edge SQL analytics endpoint in Microsoft FabricWarehouse in Microsoft FabricSQL database in Microsoft Fabric

Vrátí poslední hodnotu v seřazené sadě hodnot.

Transact-SQL konvence syntaxe

Syntax

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

Argumenty

scalar_expression

Hodnota, která se má vrátit. scalar_expression může být sloupec, poddotaz nebo jiný výraz, který má za následek jednu hodnotu. Jiné analytické funkce nejsou povolené.

[ IGNOROVAT HODNOTY NULL | RESPECT NULLS ] **

platí pro: SQL Server 2022 (16.x) a novější verze, Azure SQL Database, Azure SQL Managed Instance a Azure SQL Edge

IGNORE NULLS – Při výpočtu poslední hodnoty v oddílu ignorujte hodnoty null v datové sadě.

RESPECT NULLS – Při výpočtu poslední hodnoty v oddílu respektujte hodnoty null v datové sadě. RESPECT NULLS je výchozí chování, pokud není zadána možnost NULLS.

Další informace o tomto argumentu v Azure SQL Edge najdete v tématu Imputing missing values.

KONEC ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )

partition_by_clause rozdělí sadu výsledků vytvořenou klauzulí FROM na oddíly, na které se funkce použije. Pokud není zadáno, funkce zachází se všemi řádky sady výsledků dotazu jako s jednou skupinou.

order_by_clause určuje pořadí dat před použití funkce. Vyžaduje se order_by_clause.

rows_range_clause dále omezuje řádky v oddílu zadáním počátečních a koncových bodů.

Další informace naleznete v tématu OVER – klauzule (Transact-SQL).

Návratové typy

Stejný typ jako scalar_expression.

Poznámky

LAST_VALUE je nedeterministické. Další informace naleznete v tématu Deterministické a nedeterministické funkce.

Příklady

A. Použití LAST_VALUE nad oddíly

Následující příklad vrátí datum přijetí posledního zaměstnance v každém oddělení pro daný plat (Rate). Klauzule PARTITION BY rozděluje zaměstnance podle oddělení a funkce LAST_VALUE se použije na každý oddíl nezávisle. Klauzule ORDER BY zadaná v klauzuli OVER určuje logické pořadí, ve kterém se funkce LAST_VALUE použije na řádky v každém oddílu.

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');

Tady je sada výsledků.

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. Použití FIRST_VALUE a LAST_VALUE ve vypočítaném výrazu

Následující příklad používá funkce FIRST_VALUE a LAST_VALUE ve vypočítaných výrazech k zobrazení rozdílu mezi hodnotou kvóty prodeje pro aktuální čtvrtletí a prvním a posledním čtvrtletím roku pro daný počet zaměstnanců. Funkce FIRST_VALUE vrátí hodnotu kvóty prodeje pro první čtvrtletí roku a odečte ji od hodnoty kvóty prodeje pro aktuální čtvrtletí. Vrátí odvozený sloupec s názvem DifferenceFromFirstQuarter. V prvním čtvrtletí roku je hodnota sloupce DifferenceFromFirstQuarter 0. Funkce LAST_VALUE vrátí hodnotu kvóty prodeje za poslední čtvrtletí roku a odečte ji od hodnoty kvóty prodeje pro aktuální čtvrtletí. Vrátí se do odvozeného sloupce s názvem DifferenceFromLastQuarter. V posledním čtvrtletí roku je hodnota sloupce DifferenceFromLastQuarter 0.

Klauzule RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING je v tomto příkladu vyžadována, aby se nenulové hodnoty vrátily ve sloupci DifferenceFromLastQuarter. Výchozí rozsah je RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. V tomto příkladu by použití této výchozí oblasti (nebo zahrnutí oblasti, což vede k výchozímu použití) vedlo k tomu, že se ve sloupci DifferenceFromLastQuarter vrátí nuly. Další informace naleznete v tématu OVER – klauzule (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;

Tady je sada výsledků.

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