Veri pozisyonu mülakatlarının değişmezleri
Bu sorular veri analisti, veri bilimci ve veri mühendisi mülakatlarında neredeyse her zaman karşına çıkar. Önce kendin çöz, takılırsan ipucuna bak. Her birinin birden çok doğru çözümü vardır; sonucun doğruysa kabul edilir.
- N. en yüksek değer: DENSE_RANK veya alt sorgu + DISTINCT + OFFSET.
- Tekrar eden kayıtlar: GROUP BY + HAVING COUNT(*) > 1.
- Grup başına ilk N: ROW_NUMBER / RANK + filtre.
- Eşi olmayanlar: LEFT JOIN … IS NULL veya NOT EXISTS.
- Kendine JOIN: Çalışan–yönetici karşılaştırmaları.
Derinleş: klasik soruların tuzakları
Mülakatçı “ikinci en yüksek maaş” sorusunda aslında şunu ölçer: Eşitlikleri, NULL'ları ve boş sonucu düşünüyor musun? Aynı sorunun üç yaygın çözümü eşitlik olduğunda üç farklı cevap verir. Lezzet Kurye restoranlarının komisyon oranlarında 5 restoran %22, 6 restoran %20, 6 restoran %18:
WITH r AS (
SELECT commission_pct,
ROW_NUMBER() OVER (ORDER BY commission_pct DESC, restaurant_id) AS rn,
RANK() OVER (ORDER BY commission_pct DESC) AS rk,
DENSE_RANK() OVER (ORDER BY commission_pct DESC) AS dr
FROM lk_restaurants
)
SELECT (SELECT commission_pct FROM r WHERE rn = 3) AS row_number_3,
(SELECT MIN(commission_pct) FROM r WHERE rk = 3) AS rank_3,
(SELECT MIN(commission_pct) FROM r WHERE dr = 3) AS dense_rank_3;
“3. en yüksek farklı oran” 18'dir ve yalnızca DENSE_RANK bunu verir. ROW_NUMBER yine 22 döndürür (3. satır), RANK ise NULL (sıralar 1, 6, 12 diye atladığı için 3 yok). Soruyu netleştirmek (“farklı değer mi, satır mı?”) puan kazandırır.
Sık çıkan kalıplar
| Soru | Kalıp | Kenar durum |
|---|---|---|
| N. en yüksek değer | DENSE_RANK veya DISTINCT ... OFFSET N-1 | Eşitlik, N'den az farklı değer |
| Ardışık günler (gaps & islands) | tarih − ROW_NUMBER() sabit kalan gruplar | Aynı gün birden çok kayıt: önce DISTINCT |
| Yöneticisinden fazla kazanan | Kendine JOIN | Yöneticisi olmayan (NULL) kişi |
| Grup başına ilk N | ROW_NUMBER / RANK + filtre | Eşitlikte kaç satır istendiği |
| Yıldan yıla büyüme | LAG | Önceki dönem 0 veya yok |
Gaps & islands nasıl çalışır?
Bir müşterinin sipariş verdiği günleri sırala ve her güne sıra numarası ver. Ardışık günlerde hem tarih hem sıra birer artar, yani gün − sıra farkı sabit kalır; bu sabit, “ada” kimliğidir. Lezzet Kurye'de 19 müşteri en az 3 gün üst üste sipariş vermiş:
WITH g AS (
SELECT DISTINCT customer_id, date(placed_at) AS gun FROM lk_orders
),
a AS (
SELECT customer_id, gun,
julianday(gun) - julianday('2024-01-01')
- ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY gun) AS ada
FROM g
),
s AS (
SELECT customer_id, ada, COUNT(*) AS seri FROM a GROUP BY customer_id, ada
)
SELECT COUNT(DISTINCT customer_id) AS musteri, MAX(seri) AS en_uzun_seri
FROM s WHERE seri >= 3;