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í pro:SQL Server
Azure SQL Database
Spravovaná instance Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Koncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databáze SQL v Microsoft Fabric
Přistupuje k datům z následujícího řádku ve stejné sadě výsledků bez použití self-join od SQL Server 2012 (11.x).
LEAD poskytuje přístup k řádku na daném fyzickém posunu, který následuje po aktuálním řádku. Použijte tuto analytickou funkci ve příkazu SELECT k porovnání hodnot v aktuálním řádku s hodnotami v následujícím řádku.
Syntaxe
LEAD ( scalar_expression [ , offset ] [ , default ] ) [ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ partition_by_clause ] order_by_clause )
Arguments
scalar_expression
Hodnota, která má být vrácena, je založena na specifikovaném offsetu. Je to výraz libovolného typu, který vrací jednu (skalární) hodnotu. scalar_expression nemůže být analytickou funkcí.
ofset
Počet řádků vpřed od aktuálního řádku, ze kterých lze získat hodnotu. Pokud není zadáno, výchozí hodnota je 1. offset může být sloupec, poddotaz nebo jiný výraz, který se vyhodnocuje na kladné celé číslo nebo lze implicitně převést na bigint. offset nemůže být záporná hodnota ani analytická funkce.
default
Hodnota, kterou se vrátí, když je offset mimo rozsah partition. Pokud není stanovena výchozí hodnota, vrátí se. NULL
výchozí může být sloupec, poddotaz nebo jiný výraz, ale nemůže být analytickou funkcí.
výchozí musí být typově kompatibilní s scalar_expression.
[ IGNOROVAT HODNOTY NULL | RESPECT NULLS ]
Platí na: SQL Server 2022 (16.x) a pozdější verze, Azure SQL Database, Azure SQL Managed Instance, Azure SQL Edge
IGNORE NULLS - Ignorovat NULL hodnoty v datové sadě při výpočtu první hodnoty přes oddíl.
RESPECT NULLS - Respektovat NULL hodnoty v datové sadě při výpočtu první hodnoty přes partci.
RESPECT NULLS je výchozí chování, pokud NULLS není specifikována volba.
V SQL Server 2022 CU4 byla oprava chyby související s IGNORE NULLS in a LAGLEAD.
Další informace o tomto argumentu v Azure SQL Edge najdete v tématu Imputing missing values.
KONEC ( [ partition_by_clause ] order_by_clause )
partition_by_clause rozdělí sadu výsledků vytvořenou
FROMklauzulí 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 aplikací funkce.
Když je partition_by_clause specifikováno, určuje pořadí dat v každé části. Vyžaduje se order_by_clause. Pro více informací viz VYBRAT - OVER Clause.
Návratové typy
Datový typ daného scalar_expression.
NULL je vrácena, pokud je scalar_expression nulovatelná nebo je výchozí nastaveno na NULL.
LEAD je nedeterministické. Další informace naleznete v tématu Deterministické a nedeterministické funkce.
Examples
Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .
A. Porovnejte hodnoty mezi lety
Dotaz používá LEAD funkci k vrácení rozdílu v prodejních kvótách pro konkrétního zaměstnance v následujících letech. Protože pro poslední řádek není k dispozici žádná hodnota leadu, výchozí hodnota nula (0) je vrácena.
USE AdventureWorks2022;
GO
SELECT BusinessEntityID,
YEAR(QuotaDate) AS SalesYear,
SalesQuota AS CurrentQuota,
LEAD(SalesQuota, 1, 0) OVER (ORDER BY YEAR(QuotaDate)) AS NextQuota
FROM Sales.SalesPersonQuotaHistory
WHERE BusinessEntityID = 275 AND YEAR(QuotaDate) IN ('2005', '2006');
Tady je soubor výsledků.
BusinessEntityID SalesYear CurrentQuota NextQuota
---------------- ----------- --------------------- ---------------------
275 2005 367000.00 556000.00
275 2005 556000.00 502000.00
275 2006 502000.00 550000.00
275 2006 550000.00 1429000.00
275 2006 1429000.00 1324000.00
275 2006 1324000.00 0.00
B. Porovnávání hodnot v rámci rozkladů
Následující příklad využívá LEAD tuto funkci k porovnání prodejů mezi zaměstnanci od začátku roku. Klauzule PARTITION BY je určena tak, aby rozdělila řádky v množině výsledků podle prodejního teritoria. Funkce LEAD je aplikována na každou partition zvlášť a výpočet se pro každou partition restartuje. Klauzule ORDER BY specifikovaná v klauzuli OVER seřadí řádky v každé partition před aplikací funkce. Klauzule ORDER BY ve SELECT výroku řadí řádky v celé množině výsledků. Protože pro poslední řádek každé partition není k dispozici žádná hodnota leadu, výchozí hodnota nula (0) je vrácena.
USE AdventureWorks2022;
GO
SELECT TerritoryName, BusinessEntityID, SalesYTD,
LEAD (SalesYTD, 1, 0) OVER (PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS NextRepSales
FROM Sales.vSalesPerson
WHERE TerritoryName IN (N'Northwest', N'Canada')
ORDER BY TerritoryName;
Tady je soubor výsledků.
TerritoryName BusinessEntityID SalesYTD NextRepSales
----------------------- ---------------- --------------------- ---------------------
Canada 282 2604540.7172 1453719.4653
Canada 278 1453719.4653 0.00
Northwest 284 1576562.1966 1573012.9383
Northwest 283 1573012.9383 1352577.1325
Northwest 280 1352577.1325 0.00
C. Specifikujte libovolné výrazy
Následující příklad ukazuje specifikaci různých libovolných výrazů a ignorování NULL hodnot v syntaxi LEAD funkce.
CREATE TABLE T (a INT, b INT, c INT);
GO
INSERT INTO T VALUES (1, 1, -3), (2, 2, 4), (3, 1, NULL), (4, 3, 1), (5, 2, NULL), (6, 1, 5);
SELECT b, c,
LEAD(2 * c, b * (SELECT MIN(b) FROM T), -c / 2.0) IGNORE NULLS OVER (ORDER BY a) AS i
FROM T;
Tady je soubor výsledků.
b c i
----------- ----------- -----------
1 5 -2
2 NULL NULL
3 1 0
1 NULL 2
2 4 2
1 -3 8
D. Použijte IGNORE NULLS k nalezení hodnot ne-NULL
Následující ukázkový dotaz ukazuje použití IGNORE NULLS argumentu.
Argument IGNORE NULLS se používá jak s LAG , tak LEAD k demonstraci substituce NULL hodnot za předchozí nebo následující hodnoty ne-NULL.
- Pokud předchozí řádek obsahující
NULL,LAGpak aktuální řádek používá nejnovější nehodnotuNULL. - Pokud další řádek obsahuje a
NULLsLEAD, pak aktuální řádek používá další dostupnou nehodnotuNULL.
DROP TABLE IF EXISTS #test_ignore_nulls;
CREATE TABLE #test_ignore_nulls (column_a int, column_b int);
GO
INSERT INTO #test_ignore_nulls VALUES
(1, 8),
(2, 9),
(3, NULL),
(4, 10),
(5, NULL),
(6, NULL),
(7, 11);
SELECT column_a, column_b,
[Previous value for column_b] = LAG(column_b) IGNORE NULLS OVER (ORDER BY column_a),
[Next value for column_b] = LEAD(column_b) IGNORE NULLS OVER (ORDER BY column_a)
FROM #test_ignore_nulls
ORDER BY column_a;
--cleanup
DROP TABLE #test_ignore_nulls;
column_a column_b Previous value for column_b Next value for column_b
------------ ----------- ------------------------------ ------------------------
1 8 NULL 9
2 9 8 10
3 NULL 9 10
4 10 9 11
5 NULL 10 11
6 NULL 10 11
7 11 10 NULL
E. Použijte RESPECT NULLS pro uchování NULL hodnot
Následující ukázkový dotaz ukazuje použití RESPECT NULLS argumentu, což je výchozí chování, pokud není specifikováno, na rozdíl od argumentu IGNORE NULLS v předchozím příkladu.
- Pokud předchozí řádek obsahující
NULL,LAGpak aktuální řádek používá nejnovější hodnotu. - Pokud další řádek obsahuje a
NULLsLEAD, pak aktuální řádek používá další hodnotu.
DROP TABLE IF EXISTS #test_ignore_nulls;
CREATE TABLE #test_ignore_nulls (column_a int, column_b int);
GO
INSERT INTO #test_ignore_nulls VALUES
(1, 8),
(2, 9),
(3, NULL),
(4, 10),
(5, NULL),
(6, NULL),
(7, 11);
SELECT column_a, column_b,
[Previous value for column_b] = LAG(column_b) RESPECT NULLS OVER (ORDER BY column_a),
[Next value for column_b] = LEAD(column_b) RESPECT NULLS OVER (ORDER BY column_a)
FROM #test_ignore_nulls
ORDER BY column_a;
--Identical output
SELECT column_a, column_b,
[Previous value for column_b] = LAG(column_b) OVER (ORDER BY column_a),
[Next value for column_b] = LEAD(column_b) OVER (ORDER BY column_a)
FROM #test_ignore_nulls
ORDER BY column_a;
--cleanup
DROP TABLE #test_ignore_nulls;
column_a column_b Previous value for column_b Next value for column_b
1 8 NULL 9
2 9 8 NULL
3 NULL 9 10
4 10 NULL NULL
5 NULL 10 NULL
6 NULL NULL 11
7 11 NULL NULL
Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)
A. Porovnejte hodnoty mezi čtvrtletími
Následující příklad ukazuje funkci.LEAD Dotaz získá rozdíl v hodnotách prodejních kvót pro určeného zaměstnance v následujících kalendářních čtvrtletích. Protože po posledním řádku není k dispozici žádná hodnota leadu, výchozí hodnota nula (0).
-- Uses AdventureWorks
SELECT CalendarYear AS Year,
CalendarQuarter AS Quarter,
SalesAmountQuota AS SalesQuota,
LEAD(SalesAmountQuota, 1, 0) OVER (ORDER BY CalendarYear, CalendarQuarter) AS NextQuota,
SalesAmountQuota - LEAD(SalesAmountQuota, 1, 0) OVER (ORDER BY CalendarYear, CalendarQuarter) AS Diff
FROM dbo.FactSalesQuota
WHERE EmployeeKey = 272 AND CalendarYear IN (2001, 2002)
ORDER BY CalendarYear, CalendarQuarter;
Tady je soubor výsledků.
Year Quarter SalesQuota NextQuota Diff
---- ------- ---------- --------- -------------
2001 3 28000.0000 7000.0000 21000.0000
2001 4 7000.0000 91000.0000 -84000.0000
2001 1 91000.0000 140000.0000 -49000.0000
2002 2 140000.0000 7000.0000 7000.0000
2002 3 7000.0000 154000.0000 84000.0000
2002 4 154000.0000 0.0000 154000.0000