Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí na:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytický platformový systém (PDW)
Azure SQL Edge
SQL analytics endpoint in Microsoft Fabric
Warehouse in Microsoft Fabric
SQL database in Microsoft Fabric
Vrátí poslední hodnotu v seřazené sadě hodnot.
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
Související obsah
-
FIRST_VALUE (Transact-SQL) - SELECT – klauzule OVER (Transact-SQL)