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
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":
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".
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:
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
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.
İ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
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.
İ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