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
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
[ 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
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