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

Mülakat kalıbı: grup başına ilk N ve N'inci en yüksek değer

ROW_NUMBER, RANK ve DENSE_RANK farkı; eşitlik, NULL ve “N'inci en yüksek yoksa” durumları.

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ç.

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.

Yaklaşım

  1. Her satıra departman içinde maaşa göre sıra numarası ver.
  2. 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.
  3. 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ı

DurumNe olur?
Eşit maaşlarDENSE_RANK ikisini de 1 yapar; ROW_NUMBER birini 2. sıraya iter (hangisi olacağı belirsiz, ikinci sıralama sütunu ekle)
Departmanda tek çalışanYalnı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ş yoksaAlt sorgu çözümünde NULL dönmesi istenir; MAX(...) ile sarmak boş sonuç yerine NULL verir

Takip soruları

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.
Alıştırmalara geç (5)