SQL · · 2 dk
SQL sorgusundan karara
İyi bir analiz sadece sonucu değil, hangi soruyu cevapladığını da bilir.
Bir SQL sorgusu yazmaya başlamadan önce kendime sorduğum ilk soru: "Bu sorgunun cevabı neyi değiştirecek?" Cevap net değilse, o sorgu muhtemelen gereksiz.
Soruyu doğru formüle etmek
Veri analizinde teknik beceri kadar önemli olan şey, doğru soruyu formüle edebilmek. "Satışlarımız nasıl?" yerine "Hangi müşteri segmenti son 3 ayda en çok değer kaybetti?" sorusu, aksiyona çok daha yakın bir cevap üretir.
CRM projemde RFM analizi yaparken tam bu ayrımı yaşadım. İlk sorgum tüm müşterilerin toplam harcamasını getiriyordu — güzel ama işe yaramaz. Asıl lazım olan, segmentler arası geçişi görmekti:
SELECT
l.segment_name,
COUNT(r.customer_id) AS musteri_sayisi,
ROUND(AVG(r.monetary_score), 1) AS ort_harcama_skoru,
ROUND(AVG(r.recency_score), 1) AS ort_yakinlik_skoru
FROM RFM_Table r
JOIN Loyal l ON r.segment_id = l.segment_id
GROUP BY l.segment_name
ORDER BY musteri_sayisi DESC;
Bu sorgu bana "Şampiyonlar segmentinde 4 müşteri var, ama Risk Altındakilerde 6" dedi. Şimdi bir karar verebilirim: risk altındaki müşterilere özel kampanya mı yapsam, yoksa potansiyel sadıklara yatırım mı?
Dashboard'da az göstermek, çok söylemek
Bir dashboard'da onlarca metrik göstermek yerine, kararı etkileyecek 3-4 tanesini öne çıkarmak genelde daha etkili. OEE Monitor projesinde bu prensibi uyguladım:
| Metrik | Neden gösteriyoruz? | Aksiyon |
|---|---|---|
| Anlık OEE (%) | Üretim hattının genel durumu | < %60 ise hat sorumlusu uyarılır |
| Son 1 saat hata kodu dağılımı | Tekrar eden arızaları yakalar | En sık kod için bakım planı |
| Makine bazlı kullanılabilirlik | Darboğaz makineyi tespit eder | Kapasite planlaması |
10 metrik gösteren dashboard'dan hiçbir şey öğrenemezsiniz. 3 metrik gösteren dashboard'dan bir karar çıkar.
Sorgu optimizasyonu: küçük detaylar, büyük farklar
Sorgu doğru soruyu cevaplıyorsa, bir de hızlı cevaplaması lazım. Pratik kurallar:
- WHERE önce, JOIN sonra: Filtrelemeyi mümkün olduğunca erken yap.
WHERE date >= '2025-01-01'ile 1 milyon satırı 10 bine indirdikten sonra JOIN yapmak, 1 milyon satırı JOIN'leyip sonra filtrelemekten kat kat hızlıdır. - SELECT * kullanma: Sadece ihtiyacın olan sütunları çek. Özellikle büyük metin veya blob sütunları olan tablolarda fark dramatik.
- İndeks farkındalığı:
WHERE machine_id = 'M-01'sorgusunda machine_id'ye indeks yoksa, veritabanı tüm tabloyu tarar.EXPLAIN ANALYZEile planı kontrol etmek 30 saniyelik bir iş ama sorgu süresini 10x düşürebilir.
SQL sorgusu yazmak kolay, doğru soruyu sormak zor. Ama asıl zor olan, sorgunun cevabından bir karar üretmek.