Ana içeriğe geç
Modül 7 · Ders 3 ders 4Kurstaki 27/57~12 min
Modül dersleri (3/4)

LAG, LEAD ve devam eden toplamlar

LAG ve LEAD, aşağıdakilere erişmenizi sağlayan iki özel pencere işlevidir: aynı bölümün diğer satırları: önceki satır (LAG) veya sonraki pencere (LEAD) pencerenin ORDER BY'sine göre. Onlar satırdan satıra karşılaştırmalar (deltalar, varyasyonlar, aralıklar) için başvurulacak araç ve cari toplamlar için SUM/AVG/COUNT OVER ile birlikte.

LAG: önceki satır

SQL
LAG(colonna)            OVER (PARTITION BY p ORDER BY o)
LAG(colonna, n)         OVER (PARTITION BY p ORDER BY o)   -- n righe indietro
LAG(colonna, n, default) OVER (PARTITION BY p ORDER BY o)  -- default se non c'è

Örnek: her sipariş için "önceki siparişten bu yana geçen gün sayısı aynı müşteri":

SQL
SELECT id,
       customer_id,
       ordered_at,
       ordered_at - LAG(ordered_at) OVER (
         PARTITION BY customer_id ORDER BY ordered_at
       ) AS since_previous_order
FROM   orders
ORDER BY customer_id, ordered_at;

Her müşterinin ilk siparişi since_previous_order = NULL çünkü bölümde "önceki" yoktur.

KURŞUN: sonraki satır

LAG'nin aynası. Tipik: "bir sonraki olaya kalan süre", "fark bir sonraki sürümle".

SQL
SELECT id, ordered_at,
       LEAD(ordered_at) OVER (PARTITION BY customer_id ORDER BY ordered_at)
         - ordered_at AS to_next
FROM   orders;

Değişen toplamlar: OVER ile toplamalar

Toplama işlevleri (SUM, AVG, COUNT, MAX, MIN) şu şekilde olur: kümülatif OVER (… ORDER BY …) ile birleştirildiğinde:

SQL
SELECT order_id,
       total,
       SUM(total) OVER (
         PARTITION BY customer_id
         ORDER BY     ordered_at
       ) AS running_total
FROM   …;

Her satır için SUM, bölümdeki tüm satırların toplamını hesaplar. bu nokta, pencerenin ORDER BY'sine göre. Sonuç şudur: klasik "koşu dengesi".

Deneyin

Egzersiz#sql.m7.l3.e1
Denemeler: 0Yükleniyor…

Her sipariş için id, customer_id, order_at ve mevcut sipariş ile aynı müşterinin önceki siparişi arasındaki, sipariş_at tarafından sipariş edilen tam günlerin sayısı (FLOOR ile birlikte) olan bir günler_from_önceki sütununu gösterin. Önceki bir sipariş yoksa NULL. customer_id veorder_at'a göre sipariş verin.

Düzenleyici yükleniyor…
İpucu göster

LAG(ordered_at) OVER (PARTITION BY customer_id ORDER BY order_at), müşterinin önceki siparişinin zaman damgasını döndürür. INTERVAL değerini elde etmek için çıkarma yapın, ardından günlere dönüştürün.

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#sql.m7.l3.e2
Denemeler: 0Yükleniyor…

Teslim edilen her sipariş için (durum = 'teslim edildi'), id, customer_id, order_at, order_total (satır öğelerinin miktar toplamı * birim_fiyatı) ve Running_total'ı (müşteri başına toplamların, sipariş edilen_at tarafından sipariş edilen toplamını) gösterin. Order_total için bir CTE kullanın. customer_id veorder_at'a göre sipariş verin.

Düzenleyici yükleniyor…
İpucu göster

CTE sipariş başına toplamı hesaplar; SUM OVER, zaman içinde müşteri başına değişen toplamı üretir.

3 denemeden sonra çözüm mevcut