Ana içeriğe geç
Kesit SQL
İleri · Mülakat Hazırlığı

Mülakat soruları 2: analitik vakalar

Kümülatif toplam, aydan aya değişim, ardışık aylar, elde tutma ve medyan.

Uygulamada aç, 5 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ç.

İleri seviye vaka soruları

Kıdemli analist ve veri bilimci mülakatlarında pencere fonksiyonları ve CTE ile çözülen çok adımlı sorular gelir. Her soruda önce adımları kâğıda yaz: “Önce müşteri bazında topla, sonra sırala, sonra filtrele” gibi.

Kontrol sorusuSonucun satır sayısı beklediğin gibi mi? Her müşteri için bir satır bekliyorsan COUNT(DISTINCT customer_id) ile karşılaştır.

Çözüm şablonu: dört adım

  1. Tanecik: Sonuçta bir satır neyi temsil edecek? (müşteri, ay, müşteri × ay)
  2. Ara tablo: O taneciğe indiren CTE'yi yaz ve tek başına çalıştırıp satır sayısını kontrol et.
  3. Pencere veya birleştirme: Karşılaştırma (önceki ay, ilk sipariş, sıra) gerekiyorsa pencere fonksiyonu ya da self join ekle.
  4. Son filtre ve biçim: WHERE, yuvarlama, sıralama ve sütun adları en sonda.

Bu derste geçen kalıplar

Soru tipiKalıpTuzak
Kümülatif toplamSUM(x) OVER (ORDER BY tarih ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)Aynı tarihte birden çok satır varsa varsayılan RANGE çerçevesi eşit satırları birlikte toplar; ROWS yaz ve sıralamaya benzersiz bir sütun ekle.
Aydan aya değişimAylık CTE + LAG(n) OVER (ORDER BY ay)Sipariş olmayan ay atlanırsa LAG bir önceki dolu aya bakar. Gerekirse takvim tablosuyla boşlukları doldur.
Ardışık dönemlerDönem numarası − ROW_NUMBER() = grup anahtarıAynı ay iki kez sayılmasın diye önce DISTINCT ile müşteri × ay tekilleştir.
Elde tutmaİlk sipariş CTE'si + sonraki dönemle eşleştirmePayda “ilk siparişi o dönemde olanlar”dır, tüm müşteriler değil.
Ortalama sepetÖnce sipariş düzeyinde topla, sonra ortalama alSatır düzeyinde AVG almak çok kalemli siparişleri fazla ağırlıklandırır.

Örnek: satır ortalaması ile sipariş ortalaması farkı

WITH s AS (
  SELECT order_id, SUM(quantity) AS adet
  FROM order_items
  GROUP BY order_id
)
SELECT ROUND(AVG(adet), 2) AS siparis_basina_adet,
       (SELECT ROUND(AVG(quantity), 2) FROM order_items) AS satir_basina_adet
FROM s;

İki sayı farklıdır; mülakatta “ortalama sepet büyüklüğü” sorulduğunda beklenen birincisidir. Hangisini hesapladığını sesli söylemek, görüşmecinin en çok dikkat ettiği şeylerden biridir.

Sınır durumları sorSorgu yazmadan önce sor: iptal edilen siparişler dahil mi? Aynı gün iki sipariş varsa ne olur? Sipariş olmayan ay 0 mı görünmeli, hiç mi görünmemeli? Bu sorular çözümün kendisi kadar puan getirir.
Alıştırmalara geç (5)