Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Azure Synapse Analytics
Analiz Platformu Sistemi (PDW)
Microsoft Fabric'teki SQL analiz uç noktası
Microsoft Fabric'teki ambar
Microsoft Fabric'teki SQL veritabanı
SQL Server 2012 (11.x) ile başlayan bir kendi kendine birleştirme kullanmadan aynı sonuç kümesindeki önceki bir satırdaki verilere erişir. LAG, geçerli satırdan önce gelen belirli bir fiziksel uzaklıkta bir satıra erişim sağlar. Geçerli satırdaki değerleri önceki satırdaki değerlerle karşılaştırmak için select deyiminde bu analitik işlevi kullanın.
Transact-SQL söz dizimi kuralları
Sözdizimi
LAG (scalar_expression [ , offset ] [ , default ] ) [ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ partition_by_clause ] order_by_clause )
Bağımsız değişken
scalar_expression
Belirtilen uzaklık temelinde döndürülecek değer. Tek bir (skaler) değer döndüren herhangi bir türde bir ifadedir. scalar_expression analiz işlevi olamaz.
uzaklık
Bir değerin alındığı geçerli satırdan geri alınan satır sayısı. Belirtilmezse, varsayılan değer 1'dir.
uzaklık pozitif bir tamsayı olarak değerlendirilen veya örtük olarak bigintdönüştürülebilen bir sütun, alt sorgu veya başka bir ifade olabilir.
uzaklık negatif bir değer veya analitik işlev olamaz.
Varsayılan
uzaklık bölümün kapsamı dışında olduğunda döndürülecek değer. Varsayılan değer belirtilmezse NULL döndürülür.
varsayılan bir sütun, alt sorgu veya başka bir ifade olabilir, ancak analiz işlevi olamaz.
varsayılanscalar_expressionile tür uyumlu olmalıdır.
[ NULL'LARı YOKSAY | RESPECT NULLS ]
için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümler, Azure SQL Veritabanı, Azure SQL Yönetilen Örneği ve Azure SQL Edge
NULLS YOKSAY - Bir bölüm üzerindeki ilk değeri hesaplarken veri kümesindeki null değerleri yoksayın.
RESPECT NULLS - Bir bölüm üzerinde ilk değer hesaplanırken veri kümesindeki null değerleri dikkate alır.
RESPECT NULLS, NULLS seçeneği belirtilmezse varsayılan davranıştır.
SQL Server 2022 CU4
Azure SQL Edge'de bu bağımsız değişken hakkında daha fazla bilgi için bkz. Eksik değerleri.
OVER ( [ partition_by_clause ] order_by_clause )
partition_by_clause FROM yan tümcesi tarafından üretilen sonuç kümesini işlevin uygulandığı bölümlere böler. Belirtilmezse, işlev sorgu sonuç kümesinin tüm satırlarını tek bir grup olarak ele alır. order_by_clause işlevi uygulanmadan önce verilerin sırasını belirler. partition_by_clause belirtilirse, bölümdeki verilerin sırasını belirler. order_by_clause gereklidir. Daha fazla bilgi için bkz. OVER Yan Tümcesi (Transact-SQL).
Dönüş Türleri
Belirtilen scalar_expressionveri türü. scalar_expression null atanabilirse veya varsayılan NULL olarak ayarlandıysa NULL döndürülür.
Genel Açıklamalar
LAG belirleyici değildir. Daha fazla bilgi için bkz. Deterministic ve Nondeterministic Functions.
Örnekler
A. Yıllar arasındaki değerleri karşılaştırma
Aşağıdaki örnek, önceki yıllara göre belirli bir çalışanın satış kotalarındaki farkı döndürmek için LAG işlevini kullanır. İlk satır için kullanılabilir bir gecikme değeri olmadığından varsayılan olarak sıfır (0) döndürülür.
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');
Sonuç kümesi aşağıdadır.
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. Bölümler içindeki değerleri karşılaştırma
Aşağıdaki örnek, çalışanlar arasındaki yıllık satışları karşılaştırmak için LAG işlevini kullanır. PARTITION BY yan tümcesi, sonuç kümesindeki satırları satış bölgesine bölmek için belirtilir. LAG işlevi her bölüme ayrı ayrı uygulanır ve her bölüm için hesaplama yeniden başlatılır. OVER yan tümcesindeki ORDER BY yan tümcesi, her bölümdeki satırları sıralar. SELECT deyimindeki ORDER BY yan tümcesi, sonuç kümesinin tamamında satırları sıralar. Her bölümün ilk satırı için kullanılabilir bir gecikme değeri olmadığından varsayılan olarak sıfır (0) döndürülür.
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;
Sonuç kümesi aşağıdadır.
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. Rastgele ifadeler belirtme
Aşağıdaki örnek, ÇEŞITLI rastgele ifadeler belirtmeyi ve LAG işlevinin söz diziminde NULL değerlerini yoksaymayı gösterir.
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;
Sonuç kümesi aşağıdadır.
b c i
----------- ----------- -----------
1 -3 1
2 4 -2
1 NULL 8
3 1 -6
2 NULL 8
1 5 2
D. NULL olmayan değerleri bulmak için IGNORE NULLS kullanma
Aşağıdaki örnek sorgu, IGNORE NULLS bağımsız değişkenini kullanmayı gösterir.
IGNORE NULLS bağımsız değişkeni, önceki veya sonraki NULL olmayan değerler için NULL değerlerinin değiştirilmesini göstermek için hem LAG hem de LEAD kullanılır.
- Önceki satır
LAGile NULL içeriyorsa, geçerli satır en son NULL olmayan değeri kullanır. - Sonraki satır
LEADiçeren bir NULL içeriyorsa, geçerli satır bir sonraki kullanılabilir NULL olmayan değeri kullanır.
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 değerlerini korumak için RESPECT NULLS kullanma
Aşağıdaki örnek sorgu, önceki örnekteki IGNORE NULLS bağımsız değişkeninin aksine belirtilmezse varsayılan davranış olan RESPECT NULLS bağımsız değişkeninin kullanılmasını gösterir.
- Önceki satır
LAGile NULL içeriyorsa, geçerli satır en son değeri kullanır. - Sonraki satır
LEADiçeren bir NULL içeriyorsa, geçerli satır sonraki değeri kullanır.
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
Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
A. Üç aylık dönemler arasındaki değerleri karşılaştırma
Aşağıdaki örnekte LAG işlevi gösterilmektedir. Sorgu, önceki takvim dönemlerine göre belirli bir çalışanın satış kotalarındaki farkı döndürmek için LAG işlevini kullanır. İlk satır için kullanılabilir bir gecikme değeri olmadığından varsayılan olarak sıfır (0) döndürülür.
-- 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;
Sonuç kümesi aşağıdadır.
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