Benzersiz Sıralama için ROW_NUMBER
Her bölüm içinde belirleyici bir satır numarası atayın.
Benzersiz Sıralama için ROW_NUMBER, CoddyKit'te ücretsiz bir Coding 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, 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.
ROW_NUMBER Ne Garanti Eder
ROW_NUMBER(), bölümündeki her satıra, 1'den başlayarak pencerenin ORDER BY sırasını izleyen benzersiz ve boşluksuz bir tamsayı atar. Sıralama değerleri aynı olsa bile hiçbir iki satır aynı numarayı almaz.
Bu benzersizlik, mülakatlarda "her gruptan bir satır seçme" ve tekilleştirme sorunlarını çözmek için tam olarak bu işleve başvurulmasının nedenidir. Diğer sıralama işlevleri (RANK, DENSE_RANK) eşitliklerde benzersizlik sözü vermez.
En Basit ROW_NUMBER Sorgusu
En basit biçimi, seçilen bir sıraya göre tüm sonuç kümesini numaralandırır. ROW_NUMBER, OVER içindeki bir ORDER BY ifadesine her zaman ihtiyaç duyar; aksi halde numaralandırma belirsiz olur ve çoğu veritabanı altyapısı bunu reddeder veya uyarı verir.
Burada, işe alınma tarihine göre azalan sıralama yaparsanız en yakın zamanda işe alınan çalışan 1 numaralı satır olur.
SELECT
name,
hire_date,
ROW_NUMBER() OVER (ORDER BY hire_date DESC) AS rn
FROM employees;Bölümler İçinde Numaralandırma
Her grup içinde satırları bağımsız olarak numaralandırmak için PARTITION BY ekleyin. Sayaç her yeni bölüm değerinde 1'e sıfırlanır.
Örnekte her departman, maaşa göre sıralanmış kendi 1, 2, 3 dizisine sahip olur. Her departmandaki en yüksek maaşlı çalışan 1 numarayı alır; bu, grup başına ilk N kalıbının temelini oluşturur.
SELECT
department,
name,
salary,
ROW_NUMBER() OVER (
PARTITION BY department
ORDER BY salary DESC
) AS dept_rn
FROM employees;ROW_NUMBER ve Eşitlikler: Eşitlik Yoktur
Kritik bir mülakat noktası: İki satırın sıralama değerleri eşit olduğunda ROW_NUMBER yine de onlara farklı numaralar verir. Eşitliği bozacak bir sütun eklemediğiniz sürece hangi satırın daha düşük numarayı alacağı kesin değildir.
RANK, eşit satırlara aynı sırayı verirdi.ROW_NUMBER, aralarındaki sırayı keyfi olarak seçer.
Sonuçları tekrarlanabilir kılmak için ORDER BY ifadesine her zaman benzersiz bir eşitlik bozucu ekleyin.
SELECT
name,
salary,
ROW_NUMBER() OVER (
ORDER BY salary DESC, employee_id -- employee_id breaks ties deterministically
) AS rn
FROM employees;Kararlı Sıralama İçin Eşitlik Bozucu Kuralı
ORDER BY ifadeniz kesin bir sıralama oluşturmuyorsa (hiçbir sütun birleşimi benzersiz değilse), aynı veriler üzerinde bile satır numaralandırması farklı çalıştırmalarda değişebilir. İş görüşmecileri bu tuzağı sayfalama ve "en son kayıt" sorularında özellikle kullanır.
Genel kural: Sonucun sabit olması gerektiğinde, son sıralama anahtarı olarak birincil anahtarı veya başka bir benzersiz sütunu ekleyin.
-- Unstable: many rows can share the same created_at
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC)
-- Stable: id guarantees a single deterministic winner
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC, id DESC)Uygulamalı Örnek: Müşteri Başına En Son Sipariş
Sık karşılaşılan bir soru şudur: "Her müşterinin en son siparişini döndürün." Siparişleri müşteri başına tarihe göre azalan sırada numaralandırın, ardından dış sorguda yalnızca rn = 1 koşulunu sağlayanları bırakın.
ROW_NUMBER, her bölümde 1 numaralı tam olarak bir satırı garanti ettiğinden, müşteri başına tam olarak bir satır elde edersiniz; iki sipariş aynı zaman damgasını taşısa bile yinelenen satır oluşmaz (eşitlik bozucu bunu çözer).
SELECT customer_id, order_id, order_date, amount
FROM (
SELECT
customer_id, order_id, order_date, amount,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY order_date DESC, order_id DESC
) AS rn
FROM orders
) t
WHERE rn = 1;Uygulamalı Örnek: Satırları Tekilleştirme
ROW_NUMBER, en temiz tekilleştirme aracıdır. Yineleneni tanımlayan sütunlara göre bölümlere ayırın, bir tercih kuralına göre sıralayın ve ardından yalnızca rn = 1 koşulunu sağlayanları bırakın.
Burada aynı e-posta adresine sahip satırları yinelenen kabul ediyor ve en erken oluşturulanı bırakıyoruz. rn > 1 koşulunu sağlayan her şey silebileceğiniz veya yok sayabileceğiniz bir yinelemedir.
SELECT id, email, created_at
FROM (
SELECT
id, email, created_at,
ROW_NUMBER() OVER (
PARTITION BY email
ORDER BY created_at ASC, id ASC
) AS rn
FROM users
) t
WHERE rn = 1;Sayfalama İçin ROW_NUMBER
OFFSET/FETCH yaygın olarak desteklenmeden önce sayfalama işlemini ROW_NUMBER yürütüyordu; SQL Server'da ve birçok ETL işinde hâlâ kullanılmaktadır. Satırları sabit bir sıraya göre numaralandırın, ardından dış sorguda numaralı bir aralığa göre filtreleyin.
Mülakatlarda dikkat edilmesi gereken nokta şudur: Sayfalama ancak sıralama kesin olduğunda doğrudur; aksi halde aynı satır iki sayfada görünebilir veya tamamen atlanabilir.
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY created_at, id) AS rn
FROM articles
) t
WHERE rn BETWEEN 21 AND 40; -- page 2, 20 per pageVerileri Yeniden Sıralamak İçin Dizi Atama
Bazen yalnızca ardışık bir dizine ihtiyaç duyarsınız; örneğin sıralama sonrasında satırları yeniden numaralandırmak, 1..N etiketi oluşturmak veya satırları üretilmiş bir diziyle eşleştirmek için. İstenen sıralama üzerinde kullanılan ROW_NUMBER, boşluksuz ve düzenli bir dizi üretir.
Sıralanmamış rastgele bir kümeye daha sonra birleştirme işlemlerinde kullanmak üzere sabit bir konum vermenin yolu da budur.
SELECT
ROW_NUMBER() OVER (ORDER BY score DESC, player_id) AS leaderboard_position,
player_id,
score
FROM scores;"N. Satır" İçin ROW_NUMBER ve COUNT
"En yakın zamandaki 3. sipariş" veya "2. satır" istendiğinde ROW_NUMBER kullanın ve dış sorguda tam değere göre filtreleyin. Numaralandırma benzersiz olduğundan rn = 3 tam olarak bir satır döndürür.
RANK ile karşılaştırın: 2. farklı değeri istiyorsanız (örneğin eşitlikler dahil ikinci en yüksek maaşı), ROW_NUMBER yanlış araçtır; bunun için sonraki derste ele alınacak olan DENSE_RANK gerekir.
SELECT order_id, order_date
FROM (
SELECT order_id, order_date,
ROW_NUMBER() OVER (ORDER BY order_date DESC, order_id DESC) AS rn
FROM orders
) t
WHERE rn = 3; -- exactly the 3rd most recent orderTuzakların Özeti
Mülakat baskısı altında şu noktaları karıştırmayın:
ROW_NUMBER, bir bölüm içinde her zaman benzersiz ve boşluksuzdur.OVERiçinde birORDER BYifadesine ihtiyaç duyar; benzersiz bir eşitlik bozucu olmadığında eşitliklerde sonuçlar kesin değildir.WHEREiçinde filtrelenemez; bir alt sorgu/CTE içine alın.- Grup başına tek satır, tekilleştirme ve sayfalama için kullanın; eşitliklerin aynı numarayı alması gerektiğinde
DENSE_RANKkullanın.
Hızlı Kontrol
ROW_NUMBER, ORDER BY değerleri eşit olan satırları nasıl işler?
Özet: Kararlı Sıralama
ROW_NUMBER, bölümler içinde benzersiz ve boşluksuz numaralandırma için kullanacağınız araçtır. Şunları öğrendiniz:
- Tüm kümeleri ve bölüm başına grupları numaralandırmayı.
- Kesin ve tekrarlanabilir sonuçlar için benzersiz bir eşitlik bozucu eklemeyi.
rndeğerini dış sorguda filtreleyerek anahtar başına en son satır, tekilleştirme, sayfalama ve N. satır sorunlarını çözmeyi.
Sonraki adımda RANK ve DENSE_RANK işlevlerinin eşit değerlere bilerek aynı numarayı nasıl verdiğini ve boşluk davranışlarının nasıl farklılaştığını göreceksiniz.
Sıkça Sorulan Sorular
“Benzersiz Sıralama için ROW_NUMBER” dersi ücretsiz mi?
Evet — “Benzersiz Sıralama için ROW_NUMBER” 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.
“Benzersiz Sıralama için ROW_NUMBER” dersinde ne öğreneceğim?
Her bölüm içinde belirleyici bir satır numarası atayın. 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 2. dersidir.
“Benzersiz Sıralama için ROW_NUMBER” 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
- OVER, PARTITION BY ve ORDER BY
- Benzersiz Sıralama için ROW_NUMBER
- Eşitliklerde RANK ve DENSE_RANK Karşılaştırması
- Pencere Sonucuna Göre Filtreleme