Udostępnij za pośrednictwem


LAST_VALUE (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW) punktu końcowego analizy SQL usługi Azure SQL Edge w usłudze Microsoft FabricWarehouse w usłudze Microsoft Fabric

Zwraca ostatnią wartość w uporządkowanym zestawie wartości.

Transact-SQL konwencje składni

Składnia

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

Argumenty

scalar_expression

Wartość, która ma zostać zwrócona. scalar_expression może być kolumną, podzapytaniem lub innym wyrażeniem, które powoduje pojedynczą wartość. Inne funkcje analityczne nie są dozwolone.

[ IGNORUJ WARTOŚCI NULL | RESPECT NULLS ] **

Dotyczy: SQL Server 2022 (16.x) i nowsze wersje, Azure SQL Database, Azure SQL Managed Instance i Azure SQL Edge

IGNORE NULLS — ignoruj wartości null w zestawie danych podczas obliczania ostatniej wartości na partycji.

RESPECT NULLS — uwzględnia wartości null w zestawie danych podczas obliczania ostatniej wartości na partycji. RESPECT NULLS jest zachowaniem domyślnym, jeśli nie określono opcji NULLS.

Aby uzyskać więcej informacji na temat tego argumentu w usłudze Azure SQL Edge, zobacz Przypisywanie brakujących wartości.

OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )

partition_by_clause dzieli zestaw wyników wygenerowany przez klauzulę FROM na partycje, do których jest stosowana funkcja. Jeśli nie zostanie określony, funkcja traktuje wszystkie wiersze zestawu wyników zapytania jako pojedynczą grupę.

order_by_clause określa kolejność danych przed zastosowaniem funkcji. Wymagany jest order_by_clause.

rows_range_clause dodatkowo ogranicza wiersze w partycji, określając punkty początkowe i końcowe.

Aby uzyskać więcej informacji, zobacz OVER Clause (Transact-SQL).

Typy zwracane

Ten sam typ co scalar_expression.

Uwagi

LAST_VALUE nie jest nieokreślony. Aby uzyskać więcej informacji, zobacz funkcje deterministyczne i nieokreślone.

Przykłady

A. Używanie LAST_VALUE na partycjach

Poniższy przykład zwraca datę zatrudnienia ostatniego pracownika w każdym dziale dla danego wynagrodzenia (Rate). Klauzula PARTITION BY dzieli pracowników według działu, a funkcja LAST_VALUE jest stosowana niezależnie do każdej partycji. Klauzula ORDER BY określona w klauzuli OVER określa kolejność logiczną, w której funkcja LAST_VALUE jest stosowana do wierszy w każdej partycji.

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

Oto zestaw wyników.

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. Używanie FIRST_VALUE i LAST_VALUE w wyrażeniu obliczonym

W poniższym przykładzie użyto funkcji FIRST_VALUE i LAST_VALUE w wyrażeniach obliczonych, aby pokazać różnicę między wartością przydziału sprzedaży dla bieżącego kwartału a pierwszym i ostatnim kwartałem roku odpowiednio dla danej liczby pracowników. Funkcja FIRST_VALUE zwraca wartość limitu przydziału sprzedaży dla pierwszego kwartału roku i odejmuje ją z wartości limitu przydziału sprzedaży dla bieżącego kwartału. Zwraca on kolumnę pochodną zatytułowaną DifferenceFromFirstQuarter. W pierwszym kwartale roku wartość kolumny DifferenceFromFirstQuarter wynosi 0. Funkcja LAST_VALUE zwraca wartość limitu przydziału sprzedaży w ostatnim kwartale roku i odejmuje ją z wartości limitu przydziału sprzedaży dla bieżącego kwartału. Zwraca wartość w kolumnie pochodnej zatytułowanej DifferenceFromLastQuarter. W ostatnim kwartale roku wartość kolumny DifferenceFromLastQuarter wynosi 0.

Klauzula RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING jest wymagana w tym przykładzie, aby wartości inne niż zero zostały zwrócone w kolumnie DifferenceFromLastQuarter. Domyślny zakres to RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. W tym przykładzie użycie tego zakresu domyślnego (lub bez uwzględniania zakresu, co spowoduje użycie domyślnego) spowoduje zwrócenie zer w kolumnie DifferenceFromLastQuarter. Aby uzyskać więcej informacji, zobacz OVER Clause (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;

Oto zestaw wyników.

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