İlk N Satırı Güvenilir Şekilde Döndürme
Bir eşitlik bozucu olmadan ORDER BY ile LIMIT kullanımının neden belirsiz sonuç verebildiğini öğrenin.
İlk N Satırı Güvenilir Şekilde Döndürme, CoddyKit'te ücretsiz bir SQL 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, 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.
En Yüksek N Sorgularındaki Gizli Hata
"En yüksek maaşlı 5 çalışanı ver" isteği kolay görünür: ORDER BY salary DESC LIMIT 5. Ancak mülakat yapan kişiler bir tuzak kurar. Sınırda aynı maaşı paylaşan altı kişi varsa ne olur? Ya birçok satır eşit değere sahipse?
Temel sorun deterministikliktir: sıralama anahtarında eşit değerler olduğunda LIMIT seçimi rastgele keser ve döndürülen satırlar çalıştırmalar arasında değişebilir. Bu ders, En Yüksek N sorgularını güvenilir hale getirir.
ORDER BY + LIMIT Neden Deterministik Olmayabilir
4., 5. ve 6. sıradaki maaşların tümünün 50000 olduğunu düşünün. ORDER BY salary DESC LIMIT 5 tam olarak 5 satır döndürmelidir; bu nedenle eşit değere sahip üç satırdan ikisini tutup birini eler, ancak hangi ikisinin seçileceği tanımsızdır.
Sorguyu iki kez çalıştırdığınızda veya eniyileyici farklı planlar seçtiğinde farklı kişileri alabilirsiniz. Mülakat yapan kişilerin fark etmenizi istediği hata, bu deterministik olmayan davranıştır.
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;Çözüm 1: Benzersiz Bir Eşitlik Bozucu Ekleyin
En basit çözüm, benzersiz bir sütun, genellikle de birincil anahtar ekleyerek sıralamayı tam hale getirmektir. Artık tam anahtar üzerinde hiçbir iki satır eşit olmadığından, kesme işlemi belirli ve tekrarlanabilirdir.
Bu, hangi maaşların göründüğünü değiştirmez; ancak eşit satırlar arasındaki seçimin çalıştırmalar boyunca sabit kalmasını sağlar.
SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC
LIMIT 5;Çözüm 2: WITH TIES ile Tüm Eşit Değerleri Dahil Edin
Bazen gereksinim tam olarak N satır döndürmek değil, "sınırdaki değerle eşit olan herkesi dahil etmek" olur. Standart SQL ve SQL Server, son satırın ORDER BY değerine eşit olan ek satırları döndüren WITH TIES ifadesini sunar.
5. maaşı üç kişi paylaşıyorsa bu ifade 7 satır döndürür. WITH TIES kullanmak için bir ORDER BY gerektiğini unutmayın.
SELECT name, salary
FROM employees
ORDER BY salary DESC
FETCH FIRST 5 ROWS WITH TIES;Önce Gereksinimi Netleştirin
Kodlamaya başlamadan önce mülakat yapan kişiye şunu sorun: "Sınırda eşit değerler varsa tam olarak N satır mı, yoksa eşit değere sahip tüm satırları mı istiyorsunuz?" Bu tek netleştirme sorusu, kıdemli düzeyde olduğunuzu gösterir.
- Tam olarak N, tutarlı: benzersiz bir eşitlik bozucu ekleyin.
- Tüm eşit değerler dahil:
WITH TIESveyaRANKkullanın. - Tekrarsız değerler:
DENSE_RANKkullanın.
Taşınabilir Pencere İşlevi Yaklaşımı
Birçok veritabanı altyapısında WITH TIES bulunmaz. Taşınabilir ve güçlü kalıp, bir alt sorgu veya CTE içinde sıralama yapan bir pencere işlevi kullanıp ardından sıralamaya göre filtrelemektir. ROW_NUMBER, belirleyici bir sıralama anahtarıyla tam olarak N satır verir.
Pencere işlevini bir kapsayıcıya almalısınız; çünkü ona doğrudan WHERE içinde başvuramazsınız.
SELECT name, salary
FROM (
SELECT name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC, id ASC) AS rn
FROM employees
) ranked
WHERE rn <= 5;Eşit Değerleri Korumak İçin RANK
Tüm eşit satırları korumak ve numaralandırmada boşluklar bırakmak istediğinizde ROW_NUMBER yerine RANK kullanın. Üç satır 4. sıra için eşitse, üçünün de sırası 4 olur ve sonraki sıra 7 olur.
rank <= 5 filtresi, eşit değerler dahil olmak üzere maaş sıralamasındaki ilk beş konumda bulunan her satırı döndürür.
SELECT name, salary
FROM (
SELECT name, salary,
RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employees
) ranked
WHERE rnk <= 5;En Yüksek N Farklı Değer İçin DENSE_RANK
"En yüksek 3 maaş düzeyi" (en yüksek 3 kişi değil) farklı değerler anlamına gelir. DENSE_RANK, eşit değerlere aynı sırayı verir ve numaraları atlamaz; bu nedenle dense_rnk <= 3, en yüksek üç farklı maaştan birini kazanan herkesi döndürür.
Hangi sıralama işlevinin hangi ifadeye yanıt verdiğini bilmek, klasik bir ayırt edici yetkinliktir.
SELECT name, salary
FROM (
SELECT name, salary,
DENSE_RANK() OVER (ORDER BY salary DESC) AS drnk
FROM employees
) ranked
WHERE drnk <= 3;En Yüksek 1 İçin Özel Durum
Tek bir en yüksek satır için ORDER BY ... LIMIT 1 işe yarar, ancak yine de eşit değerler sorununu taşır. Maksimum değere sahip her satırı istiyorsanız, bir alt sorgudaki maksimum değerle karşılaştırın veya RANK() = 1 kullanın.
Maksimum değerli alt sorgu biçimi temizdir ve her SQL lehçesinde çalışır.
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);Yaklaşımları Karşılaştırma
Güvenilir En Yüksek N sonuçları için her aracın ne zaman kullanılacağının özeti:
LIMIT+ benzersiz eşitlik bozucu: tam olarak N satır, tutarlı ve en basit seçenek.FETCH ... WITH TIES: tam olarak N satır ve sınırdaki eşit değerler, standart SQL.ROW_NUMBER: tam olarak N satır, deterministik ve tamamen taşınabilir.RANK: tüm eşit değerler dahil, ilk N konum.DENSE_RANK: ilk N farklı değer.
Gruplara Göre En Yüksek N Önizlemesi
Pencere yaklaşımı çok güzel biçimde genellenir. Her grubun içindeki en yüksek N sonucu, örneğin her departmandaki en çok kazanan 2 kişiyi almak için PARTITION BY ekleyin. Aynı rn <= n filtresi bölümlendirmeden sonra uygulanır.
Grup başına En Yüksek N, tam olarak az önce öğrendiğiniz kalıp üzerine kurulan ve gerçek mülakatlarda en sık karşılaşılan sorulardan biridir.
SELECT department, name, salary
FROM (
SELECT department, name, salary,
ROW_NUMBER() OVER (PARTITION BY department
ORDER BY salary DESC, id ASC) AS rn
FROM employees
) ranked
WHERE rn <= 2;Hızlı Kontrol
Gereksinimi doğru işlevle eşleştirin.
Özet
En Yüksek N sonuçlarını güvenilir biçimde döndürmek için:
- Sıralama anahtarında eşit değerler olduğunda tek başına
ORDER BY ... LIMITdeterministik değildir. - Tam olarak N sonuç elde etmek ve tutarlılığı sağlamak için benzersiz bir eşitlik bozucu ekleyin.
- Sınırdaki eşit değerleri korumak için
WITH TIESveyaRANKkullanın. - İlk N farklı değer için
DENSE_RANKkullanın. - Mülakat yapan kişinin tam olarak N satır mı, yoksa tüm eşit değerleri mi istediğini her zaman netleştirin.
Sıkça Sorulan Sorular
“İlk N Satırı Güvenilir Şekilde Döndürme” dersi ücretsiz mi?
Evet — “İlk N Satırı Güvenilir Şekilde Döndürme” 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.
“İlk N Satırı Güvenilir Şekilde Döndürme” dersinde ne öğreneceğim?
Bir eşitlik bozucu olmadan ORDER BY ile LIMIT kullanımının neden belirsiz sonuç verebildiğini öğ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 3. dersidir.
“İlk N Satırı Güvenilir Şekilde Döndürme” 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
- Birden Çok Sütuna Göre Sıralama ve NULL Yerleşimi
- LIMIT, OFFSET ve FETCH FIRST
- İlk N Satırı Güvenilir Şekilde Döndürme
- İfadelere ve Takma Adlara Göre Sıralama