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