SQL Mülakatlarının Olmazsa Olmazı: ROW_NUMBER() ve Kullanımı

Serdar Tafralı
4 min readSep 30, 2024

--

Merhaba! Bu yazıda, SQL mülakatlarında sıkça karşımıza çıkan ve özellikle veri analiz süreçlerinde işimize çok yarayan ROW_NUMBER() fonksiyonunu ele alacağız. Bu fonksiyonun ne işe yaradığını, hangi durumlarda kullanabileceğimizi ve gerçek dünya örnekleriyle nasıl fayda sağlayabileceğimizi inceleyeceğiz. Eğer SQL bilginizi pekiştirmek ve mülakatlarda karşılaşabileceğiniz sorulara hazırlanmak istiyorsanız, doğru yerdesiniz!

ROW_NUMBER() Nedir?

ROW_NUMBER(), SQL'de her bir satıra benzersiz bir sıra numarası atamak için kullanılır. Sıralama ya da gruplama işlemlerinde satırların tek tek takip edilmesini sağlar. Veri setleri üzerinde çalışırken satırlara bir numara vermek istediğimiz her durumda ROW_NUMBER() hayat kurtarır.

Bunu mülakatlarda nasıl kullanacağımızı soruyorsanız, haydi beraber bakalım!

ROW_NUMBER() Kullanım Alanları

  1. Sıralı Numara Atama: Bir veri kümesinde her satıra bir sıra numarası vermek çok işimize yarar. Özellikle büyük veri setlerinde satırları izlemek ve ayırmak kolaylaşır.
  2. Veri Sıralaması: Eğer bir tabloyu belirli bir kritere göre sıralayıp sonuçları görmek istiyorsanız, ROW_NUMBER() tam aradığınız fonksiyon olabilir.
  3. Paging (Sayfalama): Web uygulamalarında ya da raporlamada, büyük veri setlerini sayfalara ayırmak istiyorsanız, satır numaralarını bu fonksiyonla belirleyebilir ve sayfaları çekebilirsiniz.
  4. Dublike Kayıtları Kaldırma: Aynı değere sahip birçok satır mı var? ROW_NUMBER(), tekrar eden satırları temizlemek için mükemmel bir yol sağlar.

ROW_NUMBER() ile Temel Söz Dizimi

Söz dizimi oldukça basit ve öğrenmesi kolaydır. İşte en temel hali:

SELECT 
ROW_NUMBER() OVER (ORDER BY column_name) AS row_num,
column1,
column2
FROM
table_name;

Bu sorgu ile tabloyu belirttiğiniz sütuna göre sıralar ve her satıra bir sıra numarası verir.

ROW_NUMBER() Kullanım Senaryoları

1. Sadece Sıralama ile Kullanım

Bu, en temel kullanım şeklidir. Örneğin, maaşları en yüksekten en düşüğe sıralamak ve her çalışana bir sıra numarası vermek istiyoruz:

SELECT 
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num,
employee_id,
employee_name,
salary
FROM
employees;

Burada maaş sütununa göre azalan sıralama yapılır ve her çalışana bir sıra numarası atanır.

2. PARTITION BY ile Gruplama

PARTITION BY, veri setini belirli sütunlara göre gruplandırmamızı sağlar. Bu, gruplar içinde ayrı numaralandırmalar yapmamıza imkan tanır. Mesela, departmanlar bazında çalışanları sıralamak ve maaşlarına göre numaralandırmak istiyorsak:

SELECT 
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_num,
employee_id,
department_id,
salary
FROM
employees;

Bu sorgu, her departmandaki çalışanları maaşlarına göre sıralar ve her departman için ayrı bir numaralandırma yapar. Böylece her departman kendi içinde düzenli bir sıralamaya sahip olur.

3. Sıralama Kriteri Olmadan Kullanım

Eğer ORDER BY ifadesi olmadan ROW_NUMBER() kullanırsanız, satırlar rastgele numaralar alacaktır. Bu genelde mantıklı bir kullanım olmaz, ancak bazı özel durumlarda satırlara rastgele numara atamak isteyebilirsiniz.

SELECT 
ROW_NUMBER() OVER () AS row_num,
column1,
column2
FROM
table_name;

Satırların sırası belirlenmediği için sonuçta numaralar rastgele atanır.

4. Sıralı Verinin Parçalara Ayrılması (Paging)

Özellikle web uygulamalarında büyük veri setleriyle çalışırken, verileri sayfalara ayırmak çok önemlidir. Diyelim ki, bir raporda 10'ar kayıt gösteriyorsunuz. ROW_NUMBER() ile hangi kayıtların hangi sayfada yer alacağını belirleyebilirsiniz:

WITH OrderedEmployees AS (
SELECT
ROW_NUMBER() OVER (ORDER BY employee_id) AS row_num,
employee_id,
employee_name
FROM
employees
)
SELECT *
FROM OrderedEmployees
WHERE row_num BETWEEN 2 AND 3;

Bu örnekte, 2. ve 3. sıradaki çalışanlar listelenerek sayfalama yapılır.

ROW_NUMBER() ile Dublike Kayıtları Kaldırma

Aynı değerlere sahip birden fazla satır varsa, sadece bir tanesini almak için ROW_NUMBER() işinize yarar. Örneğin, her çalışanın sadece bir kaydını tutmak istiyorsunuz:

WITH RankedEmployees AS (
SELECT
ROW_NUMBER() OVER (PARTITION BY employee_name ORDER BY employee_id) AS row_num,
employee_id,
employee_name
FROM
employees
)
DELETE FROM RankedEmployees WHERE row_num > 1;

Bu sorgu, aynı isme sahip çalışanlardan sadece bir tanesini tutar ve diğerlerini siler.

ROW_NUMBER(), RANK() ve DENSE_RANK() Arasındaki Fark

  • ROW_NUMBER(): Her satıra ardışık bir numara verir.
  • RANK(): Aynı değerlere sahip satırlara aynı numarayı verir, ancak sonraki numara atlanır.
  • DENSE_RANK(): Aynı değerlere sahip satırlara aynı numarayı verir, ancak atlama yapmaz.

Sonuç

ROW_NUMBER(), SQL'deki en güçlü ve esnek fonksiyonlardan biridir. Sıralama, gruplama, sayfalama, ve dublike kayıtları temizleme gibi işlemlerde hayatımızı kolaylaştırır. Özellikle mülakatlarda karşımıza çıkan bir konu olması nedeniyle bu fonksiyonu iyi anlamak önemlidir. Umarım bu yazı, SQL bilginizi pekiştirmenize yardımcı olmuştur!

Bir sonraki yazıda görüşmek üzere!

--

--

Serdar Tafralı

Dedicated and eager lifelong learner with a very solid mathematical background. Deeply passionate about Data Science and Artificial Intelligence