Ana içeriğe geç
Kesit SQL
Orta · Pencere Fonksiyonları

LAG ve LEAD: önceki ve sonraki satır

Dönemler arası değişim, siparişler arası süre.

Uygulamada aç, 8 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Bir önceki satıra bakmak

LAG(sutun, n, varsayilan) sıralı penceredeki n önceki satırın değerini, LEAD n sonrakini getirir (n varsayılanı 1).

WITH aylik AS (
  SELECT strftime('%Y-%m', order_date) AS ay, COUNT(*) AS siparis
  FROM orders
  WHERE order_date >= '2024-01-01'
  GROUP BY ay
)
SELECT ay, siparis,
       LAG(siparis) OVER (ORDER BY ay) AS onceki_ay,
       siparis - LAG(siparis) OVER (ORDER BY ay) AS degisim,
       ROUND(100.0 * (siparis - LAG(siparis) OVER (ORDER BY ay)) / LAG(siparis) OVER (ORDER BY ay), 1) AS yuzde
FROM aylik;

Müşteri bazında: siparişler arası gün

SELECT customer_id, order_date,
       LAG(order_date) OVER (PARTITION BY customer_id ORDER BY order_date) AS onceki,
       julianday(order_date) - julianday(LAG(order_date) OVER (PARTITION BY customer_id ORDER BY order_date)) AS gun_farki
FROM orders
WHERE customer_id = 7;
WINDOW kısaltmasıAynı pencereyi tekrar tekrar yazmak yerine sorgunun sonunda isim verebilirsin: ... OVER w ... WINDOW w AS (ORDER BY ay).

Derinleş: LAG ile değişim ve süre

LAG'ın en sık iki kullanımı: bir önceki döneme göre değişim ve iki olay arasındaki süre. İkincisinde PARTITION BY'ı unutma; yoksa bir kuryenin ilk teslimatı başka bir kuryenin son teslimatıyla karşılaştırılır.

SELECT courier_id, delivered_at,
       LAG(delivered_at) OVER (PARTITION BY courier_id ORDER BY delivered_at) AS onceki
FROM lk_orders
WHERE status = 'teslim' AND courier_id = 1
ORDER BY delivered_at
LIMIT 5;

Bölümün ilk satırında LAG NULL döner; üçüncü değişkenle varsayılan verilebilir: LAG(x, 1, 0).

Alıştırmalara geç (8)