Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
Azure Synapse Analytics
Elemzési platformrendszer (PDW)
SQL Analytics-végpont a Microsoft Fabricben
Raktár a Microsoft Fabricben
SQL-adatbázis a Microsoft Fabricben
Ugyanabban az eredményhalmazban lévő következő sorból ér el adatokat anélkül, hogy öncsatlakozást használna az SQL Server 2012-től (11.x) kezdve.
LEAD hozzáférést biztosít egy adott fizikai eltolású sorhoz, amely a jelenlegi sort követi. Ezt az elemző függvényt használjuk egy SELECT állításban, hogy összehasonlítsuk az aktuális sor értékeit a következő sorban lévő értékekkel.
Transact-SQL szintaxis konvenciók
Szemantika
LEAD ( scalar_expression [ , offset ] [ , default ] ) [ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ partition_by_clause ] order_by_clause )
Arguments
scalar_expression
A megadott eltolás alapján vissza kell adni. Ez egy olyan kifejezés, amely bármilyen típusból származik, amely egyetlen (skaláris) értéket ad vissza. scalar_expression nem lehet analitikus függvény.
ellensúlyoz
Az aktuális sorból előre irányuló sorok száma, amelyből értéket lehet kapni. Ha nincs megadva, az alapértelmezett érték 1. Az offset lehet oszlop, allekérdezés vagy más kifejezés, amely pozitív egész számra értékel, vagy implicit módon átalakítható bigint-re. Az offset nem lehet negatív érték vagy analitikus függvény.
alapértelmezett
Az eltoláskor vissza kell térni az érték, amely meghaladja a partíció hatósugarát. Ha nincs megadva alapértelmezett érték, NULL visszakerül. Az alapértelmezett lehet oszlop, allekérdezés vagy más kifejezés, de nem lehet analitikus függvény.
Az alapértelmezett típuskompatibilisnek kell lennie a scalar_expression-vel.
[ NULLÁKAT FIGYELMEN KÍVÜL | TISZTELET NULLÁK]
Alkalmazható: SQL Server 2022 (16.x) és újabb verziók, Azure SQL Database, Azure SQL Managed Instance, Azure SQL Edge
IGNORE NULLS - Figyelmen kívül NULL hagyni az adathalmazban lévő értékeket, amikor az első értéket egy partíción keresztül számoljuk.
RESPECT NULLS - Tiszteletben NULL tartani az adathalmazban lévő értékeket, amikor az első értéket egy partíción keresztül számoljuk.
RESPECT NULLS az alapértelmezett viselkedés, ha nincs megadva egy NULLS opció.
Az SQL Server 2022 CU4-ben volt egy hibajavítás az IGNORE NULLS in LAG és LEAD.
További információért erről az Azure SQL Edge-ről lásd: Hiányzó értékek imputálása.
VÉGE ( [ partition_by_clause ] order_by_clause )
partition_by_clause a záradék által
FROMlétrehozott eredményhalmazt partíciókra osztja, amelyekre a függvényt alkalmazza. Ha nincs megadva, a függvény a lekérdezés eredményhalmazának összes sorát egyetlen csoportként kezeli.order_by_clause meghatározza az adatok sorrendjét, mielőtt a függvényt alkalmaznák.
Amikor partition_by_clause meg van jelölve, az határozza meg az egyes partíciók adatainak sorrendjét. A order_by_clause kötelező. További információért lásd: SELECT - OVER klauzula.
Visszatérési típusok
A megadott scalar_expression adattípusa.
NULL akkor jelenik meg, ha scalar_expression nullable, vagy alapértelmezettként be NULLvan állítva.
LEAD nemdeterminista. További információ: Determinisztikus és Nemdeterminista függvények.
Példák
A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.
A. Összehasonlítsa az évek közötti értékeket
A lekérdezés a LEAD függvényt arra használja, hogy visszaadja egy adott alkalmazott eladási kvóta-különbségét a következő években. Mivel az utolsó sorban nincs elérhető lead-érték, visszaadja az alapértelmezett nulla (0) értéket.
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');
Itt van az eredmények összessége.
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. Összehasonlítsa az értékeket partíciókon belül
A következő példa a LEAD funkciót használja az év eleji eladásainak összehasonlítására a munkavállalók között. A PARTITION BY záradék úgy van megadva, hogy az eredményhalmazban a sorokat értékesítési terület szerint osztja meg. A LEAD függvényt minden partícióra külön-külön alkalmazzák, és a számítás újraindul minden partíciónál. A ORDER BY klauzulában meghatározott OVER klauzula sorrendbe helyezi minden partíció sorát, mielőtt a függvényt alkalmaznák. Az állítás mellékszereplője ORDER BYSELECT sorokat sorol, az egész eredményhalmazban. Mivel minden partíció utolsó sorához nincs elérhető lead-érték, az alapértelmezett nulla (0) visszatér.
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;
Itt van az eredmények összessége.
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. Tetszőleges kifejezések megadása
Az alábbi példa bemutatja, hogyan lehet különböző tetszőleges kifejezéseket megadni és figyelmen NULL kívül hagyni az értékeket a LEAD függvényszintaxisban.
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;
Itt van az eredmények összessége.
b c i
----------- ----------- -----------
1 5 -2
2 NULL NULL
3 1 0
1 NULL 2
2 4 2
1 -3 8
D. Használd a NULL FIGYELMEN kívül hagyást, hogy nem NULL értékeket találj
Az alábbi mintalekérdezés bemutatja az IGNORE NULLS érv használatát.
Az érvet IGNORE NULLS mind a LAG-nál , mind LEAD az értékek helyettesítésének NULL bemutatására használják az előző vagy a következő nem NULL értékekkel.
- Ha az előző sor
NULLtartalmazza ,LAGakkor a jelenlegi sor a legfrissebb nem-értéketNULLhasználja. - Ha a következő sor tartalmazza a
NULL,LEADakkor a jelenlegi sor a következő elérhető nem-értéketNULLhasználja.
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. Használd a RESPECT NULLS értékek megtartásához NULL
Az alábbi mintalekérdezés bemutatja az RESPECT NULLS argumentum használatát, amely az alapértelmezett viselkedés, ha nincs megadva, szemben az előző példában szereplő IGNORE NULLS argumentummal.
- Ha az előző sor
NULLtartalmazza , akkorLAGa jelenlegi sor a legfrissebb értéket használja. - Ha a következő sor tartalmaz egy
NULL,LEADakkor a jelenlegi sor a következő értéket használja.
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éldák: Azure Synapse Analytics and Analytics Platform System (PDW)
A. Összehasonlítsa az értékeket negyedévek között
A következő példa bemutatja a LEAD függvényt. A lekérdezés meghatározza egy adott alkalmazott értékesítési kvótaértékeinek különbségét a következő naptári negyedévek között. Mivel az utolsó sor után nincs elérhető lead-érték, az alapértelmezett nulla (0) értéket használják.
-- 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;
Itt van az eredmények összessége.
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