ROW_NUMBER ile Grup Başına İlk N Satır
'Kategori başına ilk 3' için temel bölümleme ve sıralama örüntüsünü öğrenin.
ROW_NUMBER ile Grup Başına İlk N Satır, 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.
Grup Başına En Yüksek N Sorusu
En yaygın SQL mülakat sorularından biri basit görünür: "Her departmanda maaşı en yüksek 3 çalışanı döndürün." Hemen LIMIT kullanan adaylar başarısız olur; çünkü LIMIT her grubu değil, sonuç kümesinin tamamını sınırlar.
Mülakat yapan kişi, pencere işlevlerini bilip bilmediğinizi kontrol eder. Standart yanıt şudur: her grubun içindeki satırları numaralandırın, ardından numarası ≤ N olan satırları tutun. Bu ders, bu kalıbı adım adım oluşturur.
LIMIT Neden Çözüm Olamaz
Aşağıdaki sorguyu yazdığınızı varsayalım. Bu sorgu her departman için 3 satır değil, tablonun tamamında toplam yalnızca 3 satır döndürür.
LIMIT (veya TOP ya da FETCH FIRST) son sonuç kümesi üzerinde çalışır. Standart SQL'de grup başına LIMIT yoktur. Mülakat yapan kişi, grup başına bir problem için LIMIT 3 önerdiğinizi duyduğunda, bölümlendirme kavramını tam olarak anlamadığınızı düşünür.
-- WRONG: only 3 rows total, not 3 per department
SELECT department, name, salary
FROM employees
ORDER BY salary DESC
LIMIT 3;ROW_NUMBER ile Tanışın
ROW_NUMBER(), bir sıralamaya göre her satıra benzersiz ve boşluksuz bir tamsayı atayan pencere işlevidir. Tek başına kullanıldığında tüm sonucu numaralandırır.
Asıl önemli bileşen PARTITION BY ifadesidir: numaralandırmayı her grup için 1'den başlatır. PARTITION BY department ile ORDER BY salary DESC ifadelerini birleştirdiğinizde her departman, maaşa göre kendi 1, 2, 3, ... sıralamasına sahip olur.
SELECT
name,
department,
salary,
ROW_NUMBER() OVER (
PARTITION BY department
ORDER BY salary DESC
) AS rn
FROM employees;Numaralandırılmış Çıktıyı Okuma
Önceki sorguyu çalıştırdıktan sonra her satırda bir rn değeri bulunur. Her departmanda en yüksek maaş rn = 1, sonraki maaş 2 ve bu şekilde devam eder. Yeni bir departmana geçildiğinde numaralandırma yeniden 1 olur.
- Satış: Ana (1), Bo (2), Cal (3), Dee (4)
- Mühendislik: Eve (1), Fin (2), Gus (3)
Artık "departman başına en yüksek 3" ifadesi, basitçe "rn <= 3 olan satırları tut" anlamına gelir.
rn WHERE İçinde Filtrelenemez
Doğal sonraki adım WHERE rn <= 3 yazmaktır, ancak bu başarısız olur. Pencere işlevleri, mantıksal yürütme sırasına göre WHERE yan tümcesinden sonra hesaplanır; bu nedenle WHERE çalıştığında rn takma adı henüz mevcut değildir.
Mülakat yapanlar bu tuzağı çok sever. Çözüm, pencere işlevini bir alt sorguda veya CTE'de hesaplamak, ardından dış sorguda iç sorgunun sonucunu filtrelemektir.
-- ERROR: rn does not exist in WHERE
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees
WHERE rn <= 3;Standart CTE Çözümü
Numaralandırmayı ranked adlı bir CTE içine alın, ardından dış WHERE içindeki filtreyle bu CTE'den seçim yapın. Mülakat yapanların görmek istediği yanıt budur ve okunması da kolaydır.
Şu iskeleti ezberleyin: gruba göre PARTITION BY kullanın, ölçüte göre ORDER BY kullanın, dış sorguda rn ≤ N filtresi uygulayın. Tek bir sayıyı değiştirerek en yüksek 1, en yüksek 5 veya herhangi bir N değerine uyarlanabilir.
WITH ranked AS (
SELECT
name, department, salary,
ROW_NUMBER() OVER (
PARTITION BY department
ORDER BY salary DESC
) AS rn
FROM employees
)
SELECT name, department, salary
FROM ranked
WHERE rn <= 3
ORDER BY department, rn;Alt Sorgu Biçimi
Mülakat yapan kişinin kullandığı lehçe eskiyse veya alt sorguları tercih ediyorsa, aynı mantık FROM içinde türetilmiş bir tabloya yerleştirilebilir. Türetilmiş bir tablonun mutlaka bir takma adı olması gerektiğini unutmayın; burada bu takma ad r'dir, aksi hâlde sözdizimi hatası alırsınız.
CTE ve türetilmiş tablo biçimleri bu problem için birbirinin yerine kullanılabilir. Mülakat yapan kişinin daha okunabilir bulduğu biçimi seçin; ikisi de eşit derecede doğrudur.
SELECT name, department, salary
FROM (
SELECT name, department, salary,
ROW_NUMBER() OVER (
PARTITION BY department ORDER BY salary DESC
) AS rn
FROM employees
) AS r
WHERE rn <= 3;En Yüksek 1: Grup Başına Tek En İyi Kayıt
"Her departmandaki maaşı en yüksek tek çalışanı bulun" ifadesi, yalnızca N = 1 demektir. Filtreyi rn = 1 olarak ayarlayın.
Neden MAX(salary) ile GROUP BY department kullanmıyoruz? Çünkü MAX size maaş değerini verir, ancak o çalışanın satırının geri kalanını (adı, işe giriş tarihi ve benzer bilgileri) vermez. ROW_NUMBER kazanan satırın tamamını korur; soru genellikle gerçekten bunu ister.
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY department ORDER BY salary DESC
) AS rn
FROM employees
)
SELECT name, department, salary, hire_date
FROM ranked
WHERE rn = 1;Belirleyici Bir Eşitlik Bozucu Ekleme
ROW_NUMBER, maaşlar eşit olsa bile her zaman tam olarak N satır döndürür. Ancak eşit maaşlı satırlardan hangisinin rn = 1 olacağı, eşitliği bozmadığınız sürece keyfidir. İki kişi 90000 kazanıyorsa ve yalnızca rn = 1 satırını tutuyorsanız, seçilen kişi farklı çalıştırmalarda değişebilir.
Sonucun kararlı ve yeniden üretilebilir olması için employee_id gibi ikincil, benzersiz bir sıralama anahtarı ekleyin. Mülakat yapanlar, sorulmadan sonuçların her çalıştırmada aynı olması gerektiğini belirten adayları takdir eder.
ROW_NUMBER() OVER (
PARTITION BY department
ORDER BY salary DESC, employee_id ASC
) AS rnSomut Bir Uygulama Örneği
region, product ve revenue sütunlarına sahip bir sales tablosu verildiğinde, bölge başına geliri en yüksek 2 ürünü döndürün. Aynı yöntemi izleyin: region'a göre bölümlendirin, revenue DESC'e göre sıralayın ve rn <= 2 olanları tutun.
Yalnızca bölümlendirme sütununun ve ölçüt sütununun değiştiğine dikkat edin. İş alanı ne olursa olsun yapı aynıdır.
WITH ranked AS (
SELECT region, product, revenue,
ROW_NUMBER() OVER (
PARTITION BY region ORDER BY revenue DESC, product
) AS rn
FROM sales
)
SELECT region, product, revenue
FROM ranked
WHERE rn <= 2
ORDER BY region, rn;Performans ve Söylenecek Noktalar
Doğruluğun ötesine geçtiğinizi göstermek için şunlardan söz edin:
(department, salary DESC)üzerinde bir dizin bulunması, motorun her bölüm için sıralı satırları verimli biçimde üretmesine yardımcı olur.- Pencere yaklaşımı tabloyu bir kez tarar; bu, her satır için çalışan ilişkili bir alt sorgudan çok daha iyidir.
- Çok büyük en yüksek-1 durumlarında bazı motorlar kısayol olarak
DISTINCT ON(Postgres) desteği sunar; ancakROW_NUMBERtaşınabilir standarttır.
Her zaman eşitlik bozucunuzu belirtin ve istenen N değerini doğrulayın.
Hızlı Kontrol
Grup başına en yüksek N kalıbını ne kadar kavradığınızı sınayın.
Özet: Grup Başına En Yüksek N
Kalıbı tek cümlede özetlersek: gruba göre PARTITION BY kullanın, ölçüte göre ORDER BY kullanın, ROW_NUMBER atayın, ardından dış sorguda rn ≤ N olanları tutun.
LIMITkümenin tamamını sınırlar, hiçbir zaman grup başına sınırlandırma yapmaz.- Pencere takma adını
WHEREiçinde filtreleyemezsiniz; onu bir CTE veya alt sorgu içine alın. - Belirleyici sonuçlar için benzersiz bir eşitlik bozucu ekleyin.
- En yüksek 1,
MAX+GROUP BYikilisinden farklı olarak kazanan satırın tamamını korur.
Tek bir sayıyı değiştirerek aynı sorgu en yüksek 1, en yüksek 5 veya herhangi bir N değerini çözer.
Sıkça Sorulan Sorular
“ROW_NUMBER ile Grup Başına İlk N Satır” dersi ücretsiz mi?
Evet — “ROW_NUMBER ile Grup Başına İlk N Satır” 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.
“ROW_NUMBER ile Grup Başına İlk N Satır” dersinde ne öğreneceğim?
'Kategori başına ilk 3' için temel bölümleme ve sıralama örüntüsünü öğ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 1. dersidir.
“ROW_NUMBER ile Grup Başına İlk N Satır” 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
- ROW_NUMBER ile Grup Başına İlk N Satır
- İlk N İçindeki Eşitlikleri Ele Alma
- Satırların Güvenli Tekilleştirilmesi
- Anahtar Başına En Güncel Satırı Koruma