0Pricing
SQL Interview Prep · Ders

İkinci En Yüksek Maaş: Beş Yöntem

Alt sorgu, LIMIT/OFFSET ve pencere işlevi çözümlerini karşılaştırın.

İkinci En Yüksek Maaş: Beş Yöntem, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 1. 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, SQL Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Interview Prep kursu toplamda 4 dersten oluşur.

Herkesin Karşılaştığı Soru

"İkinci en yüksek maaşı bulun" SQL mülakatlarında en çok sorulan tek sorudur. Mülakatçılar bu soruyu sever; çünkü birçok doğru yanıtı ve birkaç ince tuzağı vardır.

id ve salary sütunlarını içeren bir employee tablosu varsayın. Göreviniz, birbirinden farklı ikinci en yüksek maaş değerini döndürmektir.

  • Maaşlar 300, 200, 200, 100 ise yanıt ikinci satır değil, 200 olur.
  • İkinci bir birbirinden farklı maaş yoksa beklenen yanıt genellikle NULL olur.

Sonraki sahnelerde bunu beş farklı yöntemle çözecek ve her yöntemin ne zaman öne çıktığını tartışacağız.

CREATE TABLE employee (
  id     INT PRIMARY KEY,
  salary INT
);

1. Yol: MAX Değerinin Altındaki Değerlerin MAX'ı

En sezgisel çözüm şudur: ikinci en yüksek maaş, genel en yüksek değerden kesinlikle küçük olan maaşların en büyüğüdür.

Bu çözüm neredeyse İngilizce gibi okunur ve her SQL lehçesinde çalışır. İç alt sorgu en yüksek değeri bulur, dış MAX ise onun altındaki en büyük değeri bulur.

Ek olarak: İkinci bir birbirinden farklı maaş yoksa dış MAX sıfır satır üzerinde toplama yapar ve otomatik olarak NULL döndürür. Karşılıksız elde edilen bu NULL tam olarak mülakatçıların beklediği şeydir.

SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);

Alt sorgu yinelenen değerleri neden doğru işler

Yöntem 1'de hiç DISTINCT kullanmadığımıza, buna rağmen yinelenen değerlerin doğru işlendiğine dikkat edin.

Üç kişi 200 kazanıyor ve en yüksek maaş 300 ise iç sorgu 300 döndürür. Dış filtre 300'ün altındaki her satırı korur ve bunların MAX değeri, kaç tane 200 olursa olsun 200'dür.

Buradaki temel çıkarım şudur: toplulaştırma işlevleri yinelenen değerleri sizin için birleştirir. Toplulaştırma işlevi zaten doğru sonucu verirken birçok aday DISTINCT kullanarak çözümü gereğinden fazla karmaşıklaştırır.

Yöntem 2: LIMIT ve OFFSET

MySQL ve PostgreSQL'de farklı maaşları azalan sırada sıralayıp ilkini atlayabilirsiniz.

  • OFFSET 1 en yüksek maaşı atlar.
  • LIMIT 1 yalnızca sonraki maaşı alır.

Burada DISTINCT kullanmak zorunludur; aksi takdirde en yüksek maaşın yinelenen değerleri, OFFSET 1'in gerçek ikinci sıradaki maaş yerine en yüksek maaşın tekrarına gelmesine neden olur.

Tuzak: ikinci farklı değer yoksa bu sorgu NULL yerine sıfır satır döndürür. Bu uç durumu 4. derste düzelteceğiz.

SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 1;

Yöntem 3: SQL Server ve Oracle için FETCH

SQL Server ve modern Oracle, LIMIT ... OFFSET söz dizimini desteklemez. Bunun yerine ANSI standardındaki OFFSET ... FETCH söz dizimini kullanırlar.

Mantık Yöntem 2 ile aynıdır: farklı maaşları azalan sırada sıralayın, bir satırı atlayın ve bir satır alın. Farklı SQL lehçelerindeki yazım biçimini bilmek, görüşmeciye gerçek dünya deneyiminiz olduğunu gösterir.

SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;

Yöntem 4: DENSE_RANK pencere işlevi

Modern ve ölçeklenebilir yaklaşım bir pencere işlevi kullanır. DENSE_RANK en yüksek maaşa 1. sırayı, sonraki farklı maaşa 2. sırayı verir; eşit maaşlara aynı sırayı verir ve arada sıra bırakmaz.

Sıralamayı bir alt sorguda hesaplar, ardından dış sorguda 2. sırayı filtreleriz. Unutmayın: bir pencere işlevini doğrudan WHERE içinde filtreleyemezsiniz; bu nedenle alt sorgu sarmalayıcısı zorunludur.

SELECT salary AS second_highest
FROM (
  SELECT salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
  FROM employee
) ranked
WHERE rnk = 2;

Neden RANK veya ROW_NUMBER değil de DENSE_RANK

Sıralama işlevinin seçimi, "farklı" değerlerin anlamı açısından önemlidir:

  • ROW_NUMBER her satıra benzersiz bir numara verir; bu nedenle 300 kazanan iki kişi 1. ve 2. satır olur ve 2. sıra en yüksek maaşın tekrarı olur. Yanlış.
  • RANK eşit değerlerden sonra arada sıralar bırakır: 300 kazanan iki kişi 1. sırayı alır, sonraki maaş ise 3. sıraya atlar. 2. sırayı filtrelerseniz bu maaşı kaçırırsınız. Yanlış.
  • DENSE_RANK eşit değerlere aynı sırayı verir ve arada boşluk bırakmaz; böylece 2. sıra her zaman ikinci farklı maaştır. Doğru.

Yöntem 5: İlişkili alt sorguyla sayma

Pencere işlevlerinden önce kullanılan klasik bir yöntem şudur: bir maaşın en yüksek N'inci maaş olması için ondan kesin olarak daha yüksek tam N - 1 farklı maaş bulunmalıdır.

İkinci en yüksek maaş için üzerinde tam olarak bir farklı maaş bulunmasını isteriz. Bu yöntem zariftir, ancak içteki sayım dış sorgudaki her satır için çalıştığından büyük tablolarda yavaş olabilir.

Sayımı N - 1 olarak değiştirerek N'inci en yüksek maaşa kolayca genellenebilir; görüşmecilerin bu yöntemi görmek istemesinin nedeni de budur.

SELECT salary AS second_highest
FROM employee e
WHERE 1 = (
  SELECT COUNT(DISTINCT e2.salary)
  FROM employee e2
  WHERE e2.salary > e.salary
);

Baştan sona uygulamalı örnek

Maaşları 500, 500, 350, 350, 100 olarak ele alalım.

  • Yöntem 1: MAX değeri 500'dür; 500'ün altındaki en büyük değer 350'dir. Yanıt 350.
  • Yöntem 4 (DENSE_RANK): 500 → 1. sıra, 350 → 2. sıra, 100 → 3. sıra. 2. sıradaki değer 350'dir.
  • Yöntem 5: 350 maaşından daha yüksek tam olarak bir farklı maaş (500) vardır. Eşleşir. Yanıt 350.

Beş yöntemin tümü aynı sonucu verir: yinelenen değerler bulunsa bile ikinci en yüksek farklı maaş 350'dir.

Hangisini tercih etmelisiniz

Görüşme için öneriler:

  • Önce soruyu netleştirin: "Farklı maaşları mı istiyorsunuz ve hiçbiri yoksa NULL mı döndürülmeli?" Açıklama istemek puan kazandırır.
  • DENSE_RANK en güçlü varsayılan yanıttır; N'inci maaşa ve grup bazındaki kullanımlara kolayca genellenir.
  • MAX'ın altındaki MAX en iyi tek satırlık ifadedir ve ek işlem yapmadan NULL döndürür.
  • LIMIT/OFFSET kısa ve özdür, ancak kullanılan SQL lehçesine özgüdür ve uç durumda satır döndürmez.

Seçeneklerin avantaj ve dezavantajlarını açıkça belirtmek, orta düzey bir yanıtı başlangıç düzeyindeki bir yanıttan ayırır.

Kaçınılması gereken yaygın hatalar

Görüşmecilerin hazırladığı şu tuzaklara dikkat edin:

  • DENSE_RANK yerine ROW_NUMBER kullanıp en yüksek maaşı iki kez elde etmek.
  • Yinelenen en yüksek maaşlar varken LIMIT/OFFSET sürümünde DISTINCT kullanmayı unutmak.
  • ORDER BY salary DESC LIMIT 1,1 ifadesinin farklı bir değer döndürdüğünü sanmak; oysa döndürmez.
  • İkinci değer yerine ikinci satırı döndürmek.

Hızlı Kontrol

Sıralama işlevi seçimi konusundaki anlayışınızı sınayın.

Özet

Artık ikinci en yüksek maaşı bulmak için beş yöntem biliyorsunuz:

  • MAX'ın altındaki MAX - taşınabilirdir ve ek işlem yapmadan NULL döndürür.
  • LIMIT/OFFSET ve OFFSET/FETCH - kısa ve özdür, ancak SQL lehçesine özgüdür.
  • DENSE_RANK - eşit değerleri doğru işleyen, ölçeklenebilir varsayılan yöntemdir.
  • İlişkili sayım - zariftir ve N'inci değere genellenebilir.

Temel çıkarımlar: farklı değerlere ihtiyaç duyup duymadığınızı sorun, eşit değerler için DENSE_RANK kullanmayı tercih edin ve ikinci değer bulunmadığında hangi yöntemlerin NULL, hangilerinin satır döndürmediğini hatırlayın.

Sıkça Sorulan Sorular

“İkinci En Yüksek Maaş: Beş Yöntem” dersi ücretsiz mi?

Evet — “İkinci En Yüksek Maaş: Beş Yöntem” 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 SQL Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Interview Prep kursu toplamda 4 dersten oluşur.

“İkinci En Yüksek Maaş: Beş Yöntem” dersinde ne öğreneceğim?

Alt sorgu, LIMIT/OFFSET ve pencere işlevi çözümlerini karşılaştırın. SQL 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.

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

Önceden deneyim gerekmez. CoddyKit'te SQL 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 1. dersidir.

“İkinci En Yüksek Maaş: Beş Yöntem” 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 SQL Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL 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
← SQL Interview Prep Sayfasına Dön