DENSE_RANK ile N'inci En Yüksek Değer
N'inci benzersiz değere genellemeyi ve yinelemeleri ele almayı öğrenin.
DENSE_RANK ile N'inci En Yüksek Değer, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 2. 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.
N'inci en yüksek maaşa genelleme
İkinci en yüksek maaşı bulabildiğinizde görüşmeciler hemen şunu sorar: "Şimdi bana N'inci en yüksek maaşı verin." En temiz ve en kolay savunulabilir yanıt DENSE_RANK kullanır.
Şablon her zaman aynıdır: farklı maaşları azalan sırada sıralayın, ardından sırası N olan satırı filtreleyin. Mantık N değiştiğinde değişmediğinden bu tek yaklaşım, soruların tamamını yanıtlar.
Şablonu adım adım oluşturacak, eşit ve yinelenen değerleri ele alacak ve "farklı değer" anlamı için neden DENSE_RANK işlevinin doğru sıralama işlevi olduğunu açıklayacağız.
Temel şablon
Yeniden kullanılabilir N'inci en yüksek değer şablonu aşağıdadır. Sabit değeri, görüşmecinin istediği N değeriyle değiştirin.
DENSE_RANK işlevini iç sorguda hesaplarsınız; pencere işlevi WHERE içinde bulunamaz. Ardından dışarıda rnk = N filtresini uygularsınız. Üçüncü en yüksek maaş için filtreyi rnk = 3 olarak ayarlayın.
SELECT salary AS nth_highest
FROM (
SELECT salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) ranked
WHERE rnk = 3;DENSE_RANK farklı değerleri nasıl numaralandırır
DENSE_RANK eşit değerlere aynı sırayı verir ve sonrasında hiçbir zaman arada boşluk bırakmaz. Görüşmecilerin kastettiği "N'inci farklı değer" tanımı tam olarak budur.
800, 800, 600, 600, 400 maaşları için:
- 800 → 1. sıra
- 600 → 2. sıra
- 400 → 3. sıra
Dolayısıyla beş satır olmasına rağmen üçüncü en yüksek maaş 400'dür. Yinelenen değerler otomatik olarak tek bir sırada birleştirilir.
RANK neden yanlış sonuç verir
RANK kullanıldığında sonuç bozulur. RANK, eşit değerlerin sayısıyla orantılı aralıklar bırakır.
800, 800, 600, 600, 400 maaşları için:
- 800, 800 → 1. sıra (iki satır)
- 600, 600 → 3. sıra (aralık var, 2. sıra yok)
- 400 → 5. sıra
rnk = 3 filtresi 600'ü döndürür, rnk = 2 ise hiçbir şey döndürmez. Görüşmeci özellikle yarışma tipi bir sıralama istemediği sürece "N'inci farklı maaş" için doğru seçenek DENSE_RANK'tir.
ROW_NUMBER burada neden yine yanlıştır
ROW_NUMBER, eşit değerleri tamamen yok sayarak her satıra benzersiz bir numara verir. 800, 800, 600, 600, 400 maaşları için 1, 2, 3, 4, 5 değerlerini üretir.
Bu nedenle rn = 3 600'ü döndürür, ancak rn = 2 farklı bir ikinci değer yerine yinelenen 800'ü döndürür. ROW_NUMBER "N'inci satırı" yanıtlar; "N'inci farklı değeri" değil.
ROW_NUMBER işlevini yalnızca soru gerçekten belirli bir satırı istediğinde kullanın; örneğin yinelenenleri kaldırırken veya grup başına en yüksek N kaydı seçerken tam olarak bir satırı korumak istediğinizde.
SELECT salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn
FROM employee;N'yi güvenli biçimde parametreleştirme
Gerçek kodda sıralamayı sabit bir değer olarak yazmazsınız. N değerini parametre olarak geçirip bununla karşılaştırırsınız. Pencere tanımı aynı kalır; yalnızca dış filtre parametreleştirilir.
Ayrıca N. sıradaki tüm eşit maaşları döndürebilirsiniz: DENSE_RANK eşit değerler arasında aynı sırayı paylaştırdığından, WHERE rnk = N ifadesi birden fazla çalışan aynı N'inci farklı maaşı alıyorsa birden fazla satır döndürebilir. Çoğu durumda istenen davranış budur.
SELECT id, salary
FROM (
SELECT id, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employee
) ranked
WHERE rnk = :n;İlişkili sayımı genelleme
Pencere işlevlerinden önceki yaklaşım da genellenebilir: bir maaş, kendisinden kesin olarak daha yüksek tam N - 1 farklı maaş bulunduğunda N'inci en yüksek farklı maaştır.
Üçüncü en yüksek maaş için tam olarak 2 farklı daha yüksek maaş bulunmasını isteriz. Bu yöntem, pencere işlevleri olmayan eski veritabanı altyapılarında çalışır; ancak içteki sayım dış sorgudaki her satır için yeniden çalıştığından büyük ölçekte iyi ölçeklenmez.
SELECT DISTINCT salary AS nth_highest
FROM employee e
WHERE (
SELECT COUNT(DISTINCT e2.salary)
FROM employee e2
WHERE e2.salary > e.salary
) = 2;Görüşmecilerin istediği MySQL işlev biçimi
LeetCode tarzı "N'inci en yüksek maaş" sorusu genellikle tek bir değer döndüren saklı bir işlev ister. Gövde, tek bir maaş döndürecek şekilde sarmalanmış DENSE_RANK şablonundan oluşur.
Görüşmede işlev söz diziminin tam biçimini ezberlemeniz gerekmez; ancak farklı maaşlar üzerinde LIMIT N-1, 1 kullanımının kısa MySQL deyimi olduğunu bilmek yararlıdır.
SELECT DISTINCT salary
FROM employee
ORDER BY salary DESC
LIMIT 1 OFFSET 2; -- N = 3, so OFFSET N-1Uygulamalı örnek: 4. en yüksek maaş
Maaşlar: 1000, 900, 900, 700, 500, 500, 300.
DENSE_RANK ile farklı değerleri azalan sırada sıralayalım:
- 1000 → 1
- 900 → 2
- 700 → 3
- 500 → 4
- 300 → 5
4. en yüksek maaş 500'dür. Her iki 500 satırının da 4. sırayı paylaştığına dikkat edin; bu nedenle kimliklerini de seçerseniz rnk = 4 filtresi 500 kazanan iki çalışanın da satırını döndürür.
Performans notları
Yaklaşımlar büyük ölçekte nasıl karşılaştırılır?
- DENSE_RANK: veriler üzerinde tek bir sıralama, ardından bir filtre uygulanır. Verimlidir; planlayıcı sıralama için maaş sütunundaki bir dizini kullanabilir.
- İlişkili sayım: içteki toplulaştırma her satır için çalıştığından potansiyel olarak O(n kare) maliyetlidir. Büyük tablolarda kaçının.
- LIMIT/OFFSET: küçük N değerleri için hızlıdır, ancak yine de sıralama yapmalıdır; büyük OFFSET değerleri çok sayıda satırı tarayıp eler.
Yanıtınıza DENSE_RANK ile başlayın; çoğu durumda doğru yoldan sapmazsınız.
Belirtilmesi gereken uç durumlar
Güçlü adaylar sorulmasını beklemeden uç durumları belirtir:
- N farklı maaşların sayısından büyükse: filtre hiçbir satırla eşleşmez ve boş sonuç döner. 4. ders tek bir NULL döndürmeyi ele alır.
- N. sırada eşit maaşlar varsa: DENSE_RANK eşit maaşı alan tüm çalışanları döndürür; bunun istenip istenmediğine karar verin.
- N = 1: şablon yine çalışır ve en yüksek maaşı döndürür.
Hızlı Kontrol
N'inci en yüksek değer şablonunu uygulayın.
Özet
N'inci en yüksek maaş için kullanılacak tek bir temel yanıt vardır: bir alt sorguda farklı maaşları DENSE_RANK() OVER (ORDER BY salary DESC) ile sıralayın, ardından WHERE rnk = N filtresini uygulayın.
- DENSE_RANK, eşit değerlerin aynı sırayı paylaştığı ve arada boşluk bulunmayan "N'inci farklı değer" anlamına gelir.
- RANK aralıklar oluşturur; ROW_NUMBER değerleri değil satırları sayar.
- İlişkili sayım = N-1 yöntemi aynı fikri pencere işlevleri olmadan geneller, ancak büyük ölçekte iyi ölçeklenmez.
"N mevcut değerleri aşıyor" uç durumunu her zaman belirtin; bunu bir sonraki bölümde çözeceğiz.
Sıkça Sorulan Sorular
“DENSE_RANK ile N'inci En Yüksek Değer” dersi ücretsiz mi?
Evet — “DENSE_RANK ile N'inci En Yüksek Değer” 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.
“DENSE_RANK ile N'inci En Yüksek Değer” dersinde ne öğreneceğim?
N'inci benzersiz değere genellemeyi ve yinelemeleri ele almayı öğrenin. 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 2. dersidir.
“DENSE_RANK ile N'inci En Yüksek Değer” 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
- İkinci En Yüksek Maaş: Beş Yöntem
- DENSE_RANK ile N'inci En Yüksek Değer
- Departman Başına En Çok Kazanan
- N'inci Değer Yoksa NULL Döndürme