0Pricing
Coding Interview Prep · Ders

Departman Başına En Çok Kazanan

Gruplandırılmış ilk N maaş problemleri için bölümlemeyi sıralamayla birleştirin.

Departman Başına En Çok Kazanan, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.

Genel sıralamadan grup bazlı sıralamaya

Sıradaki zorluk şudur: "Her departmandaki en yüksek maaşlı çalışanı bulun." Bu soru, sıralamayı gruplamayla birleştirir ve orta düzey görüşmelerde kesinlikle sorulur.

id, name, department_id ve salary sütunlarına sahip bir employee tablosu olduğunu varsayalım. Yalnızca genel en yüksek maaşı değil, her departmandan maaşı en yüksek bir çalışanı (eşitlik durumunda birden fazlasını) istiyoruz.

Buradaki temel yeni araç, sıralamayı her departmanın içinde yeniden başlatan PARTITION BY ifadesidir.

CREATE TABLE employee (
  id            INT PRIMARY KEY,
  name          VARCHAR(100),
  department_id INT,
  salary        INT
);

PARTITION BY sıralamayı sıfırlar

Pencereye PARTITION BY department_id eklemek, veritabanına sıralamayı her departmanın içinde bağımsız olarak hesaplamasını söyler.

Her departman kendi 1. sırasından başlar. Bu nedenle 1. departmandaki en yüksek maaşlı çalışan da 5. departmandaki en yüksek maaşlı çalışan da 1. sırayı alır. Bölümlere ayırma olmadan yalnızca genel en yüksek maaş 1. sırayı alır.

SELECT name, department_id, salary,
       DENSE_RANK() OVER (
         PARTITION BY department_id
         ORDER BY salary DESC
       ) AS rnk
FROM employee;

1. sıraya filtreleme

Yalnızca en yüksek maaşlı çalışanları korumak için sıralanmış sorguyu sarın ve 1. sırayı filtreleyin. Her zaman olduğu gibi, üzerinde filtreleme yapabilmeniz için pencere işlevi önce bir alt sorguda veya CTE içinde hesaplanmalıdır.

Burada DENSE_RANK (veya RANK) kullanmak, bir departmanda iki çalışan en yüksek maaş için eşitse ikisinin de döndürülmesini sağlar. "En yüksek maaşlı çalışan" ifadesinin genellikle doğru yorumu budur.

SELECT name, department_id, salary
FROM (
  SELECT name, department_id, salary,
         DENSE_RANK() OVER (
           PARTITION BY department_id
           ORDER BY salary DESC
         ) AS rnk
  FROM employee
) t
WHERE rnk = 1;

Tam olarak bir sonuç istediğinizde ROW_NUMBER

Görüşmeci, eşit maaşlar olsa bile her departman için tam olarak bir satır isteyebilir. Bu durumda ROW_NUMBER kullanın ve en düşük kimlik numarası gibi deterministik bir eşitlik bozucu ekleyin.

Eşitlik bozucu olmazsa eşitlikler rastgele çözülür ve sonucunuz deterministik olmaz. , id ASC eklemek seçimi tekrarlanabilir hâle getirir.

SELECT name, department_id, salary
FROM (
  SELECT name, department_id, salary,
         ROW_NUMBER() OVER (
           PARTITION BY department_id
           ORDER BY salary DESC, id ASC
         ) AS rn
  FROM employee
) t
WHERE rn = 1;

Burada DENSE_RANK, ROW_NUMBER ve RANK karşılaştırması

Seçiminizi sorunun tam ifadesine göre yapın:

  • DENSE_RANK = 1: departman başına en yüksek maaşı alan tüm çalışanlar.
  • RANK = 1: ilk sıra için DENSE_RANK ile aynıdır; boşluklar yalnızca 1. sıranın altında önem kazanır.
  • ROW_NUMBER = 1: ORDER BY ifadenizle eşitlikleri bozarak departman başına tam olarak bir çalışan.

Hangisini ve neden seçtiğinizi söylemeniz, görüşmecilerin değerlendirdiği kısımdır.

Pencere işlevleri öncesindeki ilişkili yaklaşım

Pencere işlevlerinden önce standart çözüm, ilişkili bir alt sorguydu: aynı departmanda daha yüksek maaş alan kimse yoksa satırı tutun.

Bu yaklaşım doğal olarak eşit maaş alan tüm en üst düzey çalışanları döndürür. Taşınabilirdir; ancak sorgu iyileştiricisi yeniden yazmadıkça içteki MAX dış sorgunun her satırı için değerlendirildiğinden yavaş olabilir.

SELECT e.name, e.department_id, e.salary
FROM employee e
WHERE e.salary = (
  SELECT MAX(e2.salary)
  FROM employee e2
  WHERE e2.department_id = e.department_id
);

GROUP BY ile birleştirme yaklaşımı

Başka bir taşınabilir kalıp da şudur: GROUP BY ile departman başına en yüksek maaşı hesaplayın, ardından eşleşen çalışanları almak için tabloyla yeniden birleştirin.

Bu yaklaşım verimli ve anlaşılırdır. Birleştirme, maaşı departmanının en yüksek maaşına eşit olan her çalışanı geri getirir; böylece eşitlikler korunur.

SELECT e.name, e.department_id, e.salary
FROM employee e
JOIN (
  SELECT department_id, MAX(salary) AS max_sal
  FROM employee
  GROUP BY department_id
) m
  ON e.department_id = m.department_id
 AND e.salary = m.max_sal;

Departman başına en yüksek N

Bu kalıp, yeni bir fikir gerektirmeden “departman başına en yüksek maaşı alan 3 çalışan” sorgusuna genişletilebilir. Filtreyi yalnızca bir aralığa değiştirin.

DENSE_RANK ile rnk <= 3, maaş eşitliklerinde üçten fazla satır dönebilecek şekilde en yüksek üç farklı maaş düzeyini döndürür. ROW_NUMBER ile rn <= 3, departman başına tam olarak üç satır döndürür.

SELECT name, department_id, salary
FROM (
  SELECT name, department_id, salary,
         DENSE_RANK() OVER (
           PARTITION BY department_id
           ORDER BY salary DESC
         ) AS rnk
  FROM employee
) t
WHERE rnk <= 3;

Örnek çözüm

1. departman: Ana 120, Bob 120, Cara 90. 2. departman: Dan 200, Eve 150.

  • DENSE_RANK = 1: 1. departmandan Ana (120) ve Bob (120); 2. departmandan Dan (200). Toplam üç satır.
  • Kimlik numarası eşitlik bozucusuyla ROW_NUMBER = 1: Ana veya Bob'dan kimlik numarası daha düşük olan biri ve Dan. Toplam iki satır.

Veri aynı olsa da işleve bağlı olarak satır sayısı değişir. Soruyla uyumlu seçimi yapın.

Departmanları dahil edip adları birleştirme

Görüşmeciler çoğu zaman bir department tablosu ekler ve departman adını ister. Sıralamadan sonra bu tabloyu birleştirmeniz yeterlidir.

Sıralamayı employee tablosunda tutun ve arama tablosunu en sonda birleştirin; böylece bölümleme doğru ayrıntı düzeyinde gerçekleşmeye devam eder.

SELECT d.name AS department, t.name AS employee, t.salary
FROM (
  SELECT name, department_id, salary,
         DENSE_RANK() OVER (
           PARTITION BY department_id ORDER BY salary DESC
         ) AS rnk
  FROM employee
) t
JOIN department d ON d.id = t.department_id
WHERE t.rnk = 1;

Kaçınılması gereken hatalar

Grup başına sıralamada sık yapılan hatalar:

  • PARTITION BY ifadesini unutup tüm veriler üzerinde sıralama yapmak ve yalnızca şirket genelindeki en yüksek maaşlı çalışanı döndürmek.
  • Sorunun tüm eşit maaşlı çalışanların görünmesini gerektirdiği durumda ROW_NUMBER kullanmak ve en üst sırayı paylaşan çalışanları sessizce elemek.
  • Pencere işlevini sarmalamak yerine doğrudan WHERE içinde kullanmaya çalışmak.
  • Departman tablosunu sıralamadan önce birleştirip bölümleme ayrıntı düzeyini yanlışlıkla değiştirmek.

Hızlı Kontrol

Gereksinim için doğru sıralama işlevini seçin.

Özet

Departman başına en yüksek maaşı alan çalışanı bulmak, genel sıralama kalıbına PARTITION BY department_id eklenmiş hâlidir:

  • DENSE_RANK = 1, departman başına eşit maaşla en üst sırayı paylaşan tüm çalışanları döndürür.
  • ROW_NUMBER = 1, bir eşitlik bozucuyla birlikte kullanıldığında departman başına tam olarak bir çalışan döndürür.
  • Taşınabilir seçenekler: departman başına ilişkili MAX kullanmak veya GROUP BY ile bulunan en yüksek maaşı tabloyla yeniden birleştirmek.

= 1 ifadesini <= N olarak değiştirerek en yüksek N değerine genişletin. Eşit maaşları nasıl ele alacağınızı yüksek sesle belirtin.

Sıkça Sorulan Sorular

“Departman Başına En Çok Kazanan” dersi ücretsiz mi?

Evet — “Departman Başına En Çok Kazanan” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.

“Departman Başına En Çok Kazanan” dersinde ne öğreneceğim?

Gruplandırılmış ilk N maaş problemleri için bölümlemeyi sıralamayla birleştirin. Coding Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Coding Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Coding Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Departman Başına En Çok Kazanan” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Coding Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. İkinci En Yüksek Maaş: Beş Yöntem
  2. DENSE_RANK ile N'inci En Yüksek Değer
  3. Departman Başına En Çok Kazanan
  4. N'inci Değer Yoksa NULL Döndürme
← Coding Interview Prep Sayfasına Dön