Soru
Görüşmeci“Her departmanda en yüksek maaşı alan ilk 2 çalışanı getir.” Takip olarak: “Şirketteki 3. en yüksek farklı maaş nedir?”
Önce netleştir
Kod yazmadan önce sorulacak sorular. Her biri farklı bir sorguya götürür; sormamak en sık puan kaybıdır.
- Eşit maaşta iki çalışan varsa ikisi de mi dönsün, yoksa tam 2 satır mı?
- Departmanı olmayan çalışan (Genel Müdür) dahil mi?
- “3. en yüksek” farklı değerler arasında mı (DENSE_RANK) yoksa sıra numarası mı (ROW_NUMBER)?
- Departmanda 2'den az çalışan varsa ne olsun?
Yaklaşım
- Her satıra departman içinde maaşa göre sıra numarası ver.
- Eşitlik kuralına göre fonksiyonu seç: tam N satır → ROW_NUMBER (eşitlikte ikinci bir sıralama sütunu ekle), eşitler dahil → DENSE_RANK veya RANK.
- Pencere sonucunu dış sorguda filtrele (WHERE içinde pencere fonksiyonu kullanılamaz).
Çözüm 1: pencere fonksiyonu
WITH s AS (
SELECT dept_id, first_name, salary,
DENSE_RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS sira
FROM employees
WHERE dept_id IS NOT NULL
)
SELECT dept_id, first_name, salary, sira
FROM s
WHERE sira <= 2
ORDER BY dept_id, sira, first_name;
Çözüm 2: ilişkili alt sorgu (pencere fonksiyonu bilinmiyorsa)
SELECT e.dept_id, e.first_name, e.salary
FROM employees e
WHERE e.dept_id IS NOT NULL
AND (SELECT COUNT(DISTINCT e2.salary)
FROM employees e2
WHERE e2.dept_id = e.dept_id AND e2.salary > e.salary) < 2
ORDER BY e.dept_id, e.salary DESC, e.first_name;
İkinci çözüm, “benden yüksek kaç farklı maaş var?” sorusunu sorar; 2'den azsa ilk ikidedir. DENSE_RANK ile aynı sonucu verir ama her satır için alt sorgu çalıştığından büyük tablolarda yavaştır. Mülakatta önce pencere çözümünü yaz, alternatifi sözlü anlat.
Sınır durumları
| Durum | Ne olur? |
|---|---|
| Eşit maaşlar | DENSE_RANK ikisini de 1 yapar; ROW_NUMBER birini 2. sıraya iter (hangisi olacağı belirsiz, ikinci sıralama sütunu ekle) |
| Departmanda tek çalışan | Yalnızca o çalışan döner; hata yok |
| NULL maaş | Sıralamada SQL türüne göre en başa veya sona düşer; gerekirse WHERE salary IS NOT NULL |
| 3. farklı maaş yoksa | Alt sorgu çözümünde NULL dönmesi istenir; MAX(...) ile sarmak boş sonuç yerine NULL verir |
Takip soruları
- N parametre olsaydı nasıl yazardın? (değişken / sorgu parametresi)
- Büyük tabloda hangi indeks yardımcı olur? (dept_id, salary DESC)
- SQL Server'da aynı iş TOP ve CROSS APPLY ile nasıl yazılır?
Görüşmeci neye bakıyor?Eşitlik sorusunu kendiliğinden sorman ve ROW_NUMBER / RANK / DENSE_RANK farkını tek cümleyle açıklayabilmen.