COMPUTER ENGINEER

Örneklere git
Blog
SQL Server / T-SQL6 dk çalışma
30/ 65

İleri sorgu teknikleri

LAG, LEAD ve pencere sınırları

Önceki, sonraki ve pencere içindeki değer.

AnlaÖrneği inceleKendin uygula

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.

NERESİNDE KULLANIRSIN?

Müşterinin önceki siparişi ve zaman içindeki değişim için.

SIK YAPILAN HATA

LAST_VALUE’ın bütün partition’ın sonunu varsayılan olarak verdiğini sanmak.

01 / UYGULAMA

Aynı konu. Üç farklı derinlik.

T-SQL / SQL Server 2019+
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.

02 / SIRA SENDE

Önce kendin dene.

Müşteri bazında siparişler arasındaki gün farkını hesapla.

Çözümü ve açıklamasını göster
Açıklamalı çözüm
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.