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


LAG (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

Ugyanazon eredményhalmaz előző sorából származó adatokat az SQL Server 2012-től (11.x) kezdődő öncsatlakozás használata nélkül éri el. A LAG hozzáférést biztosít egy adott fizikai eltoláshoz, amely az aktuális sor előtt található. Ezzel az elemzési függvénnyel a SELECT utasításban összehasonlíthatja az aktuális sor értékeit az előző sor értékeivel.

Transact-SQL szintaxis konvenciói

Szintaxis

LAG (scalar_expression [ , offset ] [ , default ] ) [ IGNORE NULLS | RESPECT NULLS ]
    OVER ( [ partition_by_clause ] order_by_clause )  

Érvek

scalar_expression

A megadott eltolás alapján visszaadandó érték. Bármilyen típusú kifejezés, amely egyetlen (skaláris) értéket ad vissza. scalar_expression nem lehet elemzési függvény.

eltolás
Az aktuális sorból visszaszedhető sorok száma, amelyből értéket szeretne beolvasni. Ha nincs megadva, az alapértelmezett érték 1. eltolás lehet olyan oszlop, alquery vagy más kifejezés, amely pozitív egész számmá értékel, vagy implicit módon átalakítható bigint. eltolás nem lehet negatív érték vagy elemzési függvény.

alapértelmezett
Az eltolás visszaadandó érték meghaladja a partíció hatókörét. Ha nincs megadva alapértelmezett érték, a null értéket adja vissza. alapértelmezett lehet oszlop, részquery vagy más kifejezés, de nem lehet elemzési függvény. alapértelmezett típuskompatibilisnek kell lennie scalar_expression.

[ NULL ÉRTÉKEK FIGYELMEN KÍVÜL HAGYÁSA | RESPECT NULLS ]

A következővonatkozik: SQL Server 2022 (16.x) és újabb verziók, Azure SQL Database, Felügyelt Azure SQL-példány és Azure SQL Edge

NULLS FIGYELMEN KÍVÜL HAGYÁSA – Az adathalmaz null értékeinek figyelmen kívül hagyása az első érték partíción történő kiszámításakor.

RESPECT NULLS – Az adathalmaz null értékeinek tiszteletben tartása az első érték partíción történő kiszámításakor. RESPECT NULLS az alapértelmezett viselkedés, ha nincs megadva null érték.

Az SQL Server 2022 CU4 hibajavítása és null értékekkel kapcsolatos.

Az Azure SQL Edge argumentumával kapcsolatos további információkért lásd hiányzó értékekimputálása című témakört.

VÉGE ( [ partition_by_clause ] order_by_clause )

partition_by_clause a FROM záradék által 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 a függvény alkalmazása előtt. Ha partition_by_clause van megadva, meghatározza a partícióban lévő adatok sorrendjét. A order_by_clause szükséges. További információ: OVER záradék (Transact-SQL).

Visszatérési típusok

A megadott scalar_expressionadattípusa. NULL értéket ad vissza, ha scalar_expression null értékű, vagy alapértelmezett NULL értékre van állítva.

Általános megjegyzések

A LAG nemdeterminista. További információ: determinisztikus és nem determinisztikus függvények.

Példák

Egy. Értékek összehasonlítása évek között

Az alábbi példa a HACS függvény használatával adja vissza egy adott alkalmazott értékesítési kvótáinak különbségét az előző évekhez képest. Figyelje meg, hogy mivel az első sorhoz nem érhető el késési érték, a rendszer a nulla (0) alapértelmezett értékét adja vissza.

USE AdventureWorks2022;  
GO  
SELECT BusinessEntityID, YEAR(QuotaDate) AS SalesYear, SalesQuota AS CurrentQuota,   
       LAG(SalesQuota, 1,0) OVER (ORDER BY YEAR(QuotaDate)) AS PreviousQuota  
FROM Sales.SalesPersonQuotaHistory  
WHERE BusinessEntityID = 275 AND YEAR(QuotaDate) IN ('2005','2006');  

Itt van az eredményhalmaz.

BusinessEntityID SalesYear   CurrentQuota          PreviousQuota  
---------------- ----------- --------------------- ---------------------  
275              2005        367000.00             0.00  
275              2005        556000.00             367000.00  
275              2006        502000.00             556000.00  
275              2006        550000.00             502000.00  
275              2006        1429000.00            550000.00  
275              2006        1324000.00            1429000.00  
  

B. Partíciók értékeinek összehasonlítása

Az alábbi példa a LAG függvénnyel hasonlítja össze az alkalmazottak közötti éves értékesítéseket. A PARTITION BY záradék meg van adva, hogy a sorokat elosztsa az eredményhalmazban értékesítési terület szerint. A LAG függvényt a rendszer külön alkalmazza az egyes partíciókra, és az egyes partíciók számítási újraindulnak. Az ORDER BY záradék az OVER záradékban az egyes partíciók sorait rendeli meg. A SELECT utasítás ORDER BY záradéka a teljes eredményhalmaz sorait rendezi. Figyelje meg, hogy mivel az egyes partíciók első sorához nem érhető el késési érték, a rendszer a nulla (0) alapértelmezett értékét adja vissza.

USE AdventureWorks2022;  
GO  
SELECT TerritoryName, BusinessEntityID, SalesYTD,   
       LAG (SalesYTD, 1, 0) OVER (PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS PrevRepSales  
FROM Sales.vSalesPerson  
WHERE TerritoryName IN (N'Northwest', N'Canada')   
ORDER BY TerritoryName;  

Itt van az eredményhalmaz.

TerritoryName            BusinessEntityID SalesYTD              PrevRepSales  
-----------------------  ---------------- --------------------- ---------------------  
Canada                   282              2604540.7172          0.00  
Canada                   278              1453719.4653          2604540.7172  
Northwest                284              1576562.1966          0.00  
Northwest                283              1573012.9383          1576562.1966  
Northwest                280              1352577.1325          1573012.9383  
  

C. Tetszőleges kifejezések megadása

Az alábbi példa bemutatja a különböző tetszőleges kifejezések megadását és a NULL értékek figyelmen kívül hagyását a LAG függvény szintaxisában.

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,   
    LAG(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ényhalmaz.

b           c           i  
----------- ----------- -----------  
1           -3          1  
2           4           -2  
1           NULL        8  
3           1           -6  
2           NULL        8  
1           5           2  

D. Nem NULL értékek keresése az IGNORE NULLS függvény használatával

Az alábbi minta lekérdezés az IGNORE NULLS argumentum használatát mutatja be.

Az IGNORE NULLS argumentumot a LAG és LEAD is használja a NULL értékek helyettesítésének szemléltetésére az előző vagy a következő nem NULL értékek esetében.

  • Ha az előző sor null értéket tartalmazott LAG, akkor az aktuális sor a legutóbbi nem NULL értéket használja.
  • Ha a következő sor egy NULL értéket tartalmaz LEAD, akkor az aktuális sor a következő elérhető nem NULL é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) 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. NULL értékek megőrzése a RESPECT NULLS használatával

Az alábbi minta lekérdezés a RESPECT NULLS argumentum használatát mutatja be, amely az alapértelmezett viselkedés, ha nincs megadva, szemben az előző példában szereplő IGNORE NULLS argumentumtal.

  • Ha az előző sor null értéket tartalmazott LAG, akkor az aktuális sor a legutóbbi értéket használja.
  • Ha a következő sor egy NULL értéket tartalmaz LEAD, akkor az aktuális 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)

Egy. Értékek összehasonlítása negyedévek között

Az alábbi példa a LAG függvényt mutatja be. A lekérdezés a LAG függvénnyel adja vissza egy adott alkalmazott értékesítési kvótáinak különbségét az előző naptári negyedévekben. Figyelje meg, hogy mivel az első sorhoz nem érhető el késési érték, a rendszer a nulla (0) alapértelmezett értékét adja vissza.

-- Uses AdventureWorks  
  
SELECT CalendarYear, CalendarQuarter, SalesAmountQuota AS SalesQuota,  
       LAG(SalesAmountQuota,1,0) OVER (ORDER BY CalendarYear, CalendarQuarter) AS PrevQuota,  
       SalesAmountQuota - LAG(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ényhalmaz.

Year Quarter  SalesQuota  PrevQuota  Diff  
---- -------  ----------  ---------  -------------  
2001 3        28000.0000      0.0000   28000.0000  
2001 4         7000.0000  28000.0000  -21000.0000  
2001 1        91000.0000   7000.0000   84000.0000  
2002 2       140000.0000  91000.0000   49000.0000  
2002 3         7000.0000 140000.0000  -70000.0000  
2002 4       154000.0000   7000.0000   84000.0000

Következő lépések