İleri sorgu teknikleri
LAG, LEAD ve pencere sınırları
Önceki, sonraki ve pencere içindeki değer.
Kavramı anlayalım
LAG ve LEAD, partition içindeki önceki veya sonraki sıraya ait değeri getirir. İstenen sıra ORDER BY ile tanımlanmalıdır. Aynı tarihte birden çok kayıt varsa OrderId gibi ek anahtar sıralamayı kararlı kılar. İlk veya son satırda komşu yoksa varsayılan NULL döner.
FIRST_VALUE ve LAST_VALUE frame sınırlarına tabidir. LAST_VALUE varsayılan frame nedeniyle son partition satırı yerine mevcut frame’in sonunu verebilir. Tüm partition’ın sonunu istiyorsan ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING yaz. Window sırası, sonuç görüntü sırasını ayrıca garanti etmez.
Müşterinin önceki siparişi ve zaman içindeki değişim için.
LAST_VALUE’ın bütün partition’ın sonunu varsayılan olarak verdiğini sanmak.
Aynı konu. Üç farklı derinlik.
SELECT OrderId, OrderDate, LAG(OrderDate) OVER (ORDER BY OrderDate, OrderId) AS PreviousDate FROM lab.SalesOrder;İlk satırın önceki tarihi NULL’dır.
Bu sayfa SQL çalıştırmaz. Örnekleri indirilebilir SqlStudioLab veritabanında, SSMS’de uygula. Geçici tablo örneklerini yeniden çalıştırırken yalnız ilgili #tabloyu temizle. VIEW, procedure ve function örnekleri lab’da kalıcı nesne oluşturur; üretim bağlantısı kullanma.
Önce kendin dene.
Müşteri bazında siparişler arasındaki gün farkını hesapla.
Çözümü ve açıklamasını göster
WITH P AS (SELECT CustomerId, OrderId, OrderDate, LAG(OrderDate) OVER (PARTITION BY CustomerId ORDER BY OrderDate, OrderId) AS PreviousDate FROM lab.SalesOrder) SELECT *, DATEDIFF(day, PreviousDate, OrderDate) AS DaysBetween FROM P;Her müşterinin ilk siparişinde fark NULL’dır. NULL’ı sıfıra çevirmek ilk siparişle aynı gün tekrar siparişi karıştırır.