Megosztás a következőn keresztül:


LEAD (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)SQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-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 FROM lé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 NULL tartalmazza , LAGakkor a jelenlegi sor a legfrissebb nem-értéketNULL használja.
  • Ha a következő sor tartalmazza a NULL , LEADakkor a jelenlegi sor a következő elérhető nem-értéketNULL 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) 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 NULL tartalmazza , akkor LAGa 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