Kurs
SQL ile çalışırken verileri sıralamak kolaydır; çünkü satırları düzenlemek için ORDER BY kullanabilirsiniz. Ancak, sonuçları yalnızca sıralamak her satırın bu sıradaki konumunu göstermez. İşte burada sıralama (ranking) devreye girer. Sadece sıralanmış veriyi görüntülemek yerine, belirli ölçütlere göre her satıra 1., 2. veya 3. gibi bir konum atamak isteyebilirsiniz.
RANK() fonksiyonu, tanımlanan düzene göre her satıra sayısal bir derece atayarak bu sorunu çözer. RANK(), bir dizi satır üzerinde hesaplama yaparken yine de her bir satır için sonuç döndürmenizi sağlayan SQL pencere fonksiyonlarının bir parçasıdır.
Bu eğitimde, RANK() sözdizimini, pratik örnekleri görecek, eşitlikleri nasıl ele aldığını anlayacak ve DENSE_RANK() ve ROW_NUMBER() gibi benzer fonksiyonlarla nasıl karşılaştırıldığını inceleyeceğiz.
SQL’e yeni başlıyorsanız, bizim Introduction to SQL kursuyla başlayın; biraz deneyiminiz varsa Intermediate SQL kursunu tercih edebilirsiniz.
SQL RANK() Fonksiyonu Nedir?
SQL RANK() fonksiyonu, belirtilen düzene göre her satıra bir derece atayan bir pencere fonksiyonudur. Sıralama tamamen pencere fonksiyonu içindeki ORDER BY ile belirlenir. Yani, ORDER BY ifadesine göre her satıra 1, 2, 3 gibi bir konum verir.
RANK() kullandığınızda şunlara dikkat etmelisiniz:
- Aynı değere sahip satırlar (eşitlikler) aynı dereceyi alır.
- Eşitlik olduğunda, sıralama dizisinde boşluklar oluşur. Örneğin, iki satır 2. sırayı alırsa bir sonraki derece 3 değil 4 olur.
SQL RANK() Sözdizimi
RANK() fonksiyonunun temel sözdizimi şöyledir:
RANK() OVER (ORDER BY column)
Burada:
-
OVERifadesi: Fonksiyonun çalıştığı pencereyi (satır kümesini) tanımlar. -
ORDER BY: Sıralamanın nasıl uygulanacağını belirler; örneğin yüksekten düşüğe. -
PARTITION BY(isteğe bağlı): Veriyi gruplara böler ve her grup içinde ayrı ayrı sıralama yapar.
Aşağıda, PARTITION BY ifadesiyle birlikte RANK() fonksiyonunun sözdizimi yer almaktadır:
RANK() OVER (PARTITION BY column1 ORDER BY column2)
SQL RANK() fonksiyonu, başlıca veritabanlarının çoğunda geniş ölçüde desteklenir. Buna PostgreSQL, MySQL (8.0+), Microsoft SQL Server ve Oracle Database dahildir. Sözdizimi büyük ölçüde tutarlıdır; çünkü ANSI SQL standardının bir parçasıdır.
SQL RANK() Temel Örnek
Artık RANK() fonksiyonunun sözdizimini anladığınıza göre, nasıl çalıştığını gösteren basit bir örnek yapalım.
Her çalışanın maaş bilgisini içeren employees tablosuna sahip olduğunuzu varsayalım.

Çalışanları maaşlarına göre sıralamak için aşağıdaki sorguyu kullanabilirsiniz.
-- Rank employees by salary
SELECT
name,
salary,
RANK() OVER (ORDER BY salary DESC) AS rank_position
FROM employees;
Yukarıdaki sorguda, satırlar en yüksek maaştan başlayarak sıralanır; dolayısıyla en yüksek maaş 1. dereceyi alır. İki satırın maaşı aynıysa aynı dereceyi alırlar.

Dikkat ederseniz, iki satırın aynı değerleri varsa aynı dereceyi alırlar.
Bundan sonra bir sonraki derece atlanır. SQL, eşitliği hesaba katarak bir sonraki derece değerini atlar.
Gruplama ve veri toplama hakkında daha fazla bilgi edinmek için Introduction to SQL Server kursumuzu öneririm.
PARTITION BY ile SQL RANK()
Daha önce öğrendiğimiz gibi, PARTITION BY ifadesi sıralamayı tüm veri kümesi yerine gruplar içinde uygulamanıza olanak tanır.
Aşağıdaki örnekte, çalışanlar department sütununa göre gruplandırılır ve her departmanda sıralama baştan başlar. Böylece her grubun kendi bağımsız sıralama dizisi olur.
-- Rank employees within each department
SELECT
name,
department,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;

Yukarıdaki sonuçlardan, “Sales” bölümünde hem Emily Johnson hem de Michael Brown’ın 1. dereceyi paylaştığını; “HR” bölümünde ise William Miller ve Olivia Wilson’ın 1. dereceyi paylaştığını görüyoruz.
SQL RANK() vs. DENSE_RANK() vs. ROW_NUMBER()
SQL’de verileri sıralarken RANK(), DENSE_RANK() veya ROW_NUMBER() kullanabilirsiniz. Bu fonksiyonlar benzer görünse de aşağıdaki şekilde davranırlar:
-
RANK(): Eşitlikler aynı dereceyi paylaşır; bu nedenle eşitliklerden sonra boşluklar oluşur. -
DENSE_RANK(): Eşitlikler aynı dereceyi paylaşır; bu nedenle sıralamada boşluk olmaz. -
ROW_NUMBER(): Değerler eşit olsa bile her satır benzersiz bir numara alır, eşitlik yoktur.
Bu farkları daha iyi anlamak için aşağıdaki sorguyla yan yana bir karşılaştırma yapalım:
-- Compare RANK() vs DENSE_RANK() vs ROW_NUMBER()
SELECT
name,
salary,
RANK() OVER (ORDER BY salary DESC) AS rank_val, -- allows gaps after ties
DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank1, -- no gaps, consecutive ranks
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num -- always unique sequence
FROM employees;

Yukarıdaki sonuçlardan hareketle şunları tercih edebilirsiniz:
-
RANK()kullanın: Konum önemliyse ve boşluklar kabul edilebilirse. -
DENSE_RANK()kullanın: Sürekli (boşluksuz) bir sıralama istiyorsanız. -
ROW_NUMBER()kullanın: Her satırın benzersiz bir numaraya sahip olması gerekiyorsa; örneğin sayfalama işlemlerinde.
SQL RANK() Ne Zaman Kullanılır?
SQL RANK() fonksiyonu, verileri sıralarken eşitlikleri doğal şekilde ele almak istediğinizde en kullanışlı araçtır. Aşağıdaki kullanım durumları için de önemli buluyorum:
- Lider tabloları: Skorlara göre oyuncuları veya kullanıcıları derecelendirirken eşit performans için eşitliklere izin vermek istediğinizde.
- Satış performansını sıralama: Sonuçlar eşit olsa bile gelire göre en iyi çalışanları veya bölgeleri belirlemek istediğinizde.
- En iyi N değerlerini belirleme: “En yüksek 3 maaş” gibi sorgularda, özellikle eşitliklerin dahil edilmesi gerektiğinde kullanışlıdır.
SQL RANK() ile Yapılan Yaygın Hatalar
SQL RANK() fonksiyonunu kullanırken karşılaştığım bazı hatalar ve bunlardan nasıl kaçınabileceğiniz:
-
ORDER BY’ı unutmak:
ORDER BYolmadan sıralamanın tanımlı bir mantığı olmaz ve beklenmedik sonuçlar dönebilir. -
Eşitlik davranışını yanlış anlamak: Yeni başlayan biri olarak 1, 2, 2, 3 bekleyebilirsiniz; ancak
RANK()derecelerde boşluk oluşturur (1, 2, 2, 4). -
ROW_NUMBER() gerekirken RANK() kullanmak: Benzersiz ardışık değerlere ihtiyacınız varsa
ROW_NUMBER()daha iyi bir seçimdir. -
Gerekliyken PARTITION BY kullanmamak: Bölümleme olmadan sıralama, gruplar içinde değil küresel olarak uygulanır.
SQL RANK() Kullanımı için En İyi Uygulamalar
Sorgularınızı temiz tutmak ve beklediğiniz sonuçları almak için, SQL RANK() fonksiyonunu kullanırken şu en iyi uygulamaları izlemenizi öneririm:
-
Her zaman net bir sıralama tanımlayın: Belirsiz sıralamaları önlemek için
ORDER BYifadesindeDESCgibi yönü açıkça belirtin. -
Doğru sıralama fonksiyonunu seçin: Eşitlikleri nasıl ele almak istediğinize bağlı olarak
RANK(),DENSE_RANK()veyaROW_NUMBER()kullanın. -
Eşitlik senaryolarını test edin: Canlı ortama almadan önce, mükerrer değerler olduğunda verinizin nasıl davrandığını doğrulayın.
-
Filtreleme ile birleştirin:
RANK()fonksiyonunu doğrudan birWHEREifadesinde kullanamayacağınız için, “En İyi N” filtrelemesi yapmak istediğinizde sıralama sorgunuzu bir Alt sorgu veya CTE içine almalısınız.
Sonuç
RANK(), özellikle eşit değerler gibi gerçek hayat senaryolarını yansıtmanız gerektiğinde SQL’de sıralı karşılaştırmalar yapmak için kullanışlı bir araçtır. Eşitlikleri nasıl ele aldığını ve neden derecelerin tekrar edip bazı sayıların atlanabileceğini anlamak, doğru analiz için önemlidir. Bu davranışı benimsedikten sonra, belirli kullanım durumunuza en uygun olanı seçmek üzere DENSE_RANK() ve ROW_NUMBER() gibi alternatiflerle ne zaman birlikte kullanmanız gerektiğini bilebilirsiniz.
Artık SQL’de verileri nasıl derecelendireceğinizi öğrendiğinize göre, yetkin bir veri analisti olmakla ilgileniyorsanız gerekli becerileri edinmek için Associate Data Analyst in SQL kariyer yolumuzu incelemenizi öneririm. SQL kullanarak profesyonel panolar oluşturmayı öğrenmek istiyorsanız Reporting in SQL kursumuz da uygundur.
SQL RANK() SSS
RANK() ORDER BY'dan nasıl farklıdır?
ORDER BY yalnızca satırları sıralar; RANK() ise sıralamadan sonra her satıra sayısal bir konum atar.
RANK() sonuçlarında neden boşluklar var?
Eşitlikler olduğunda birden fazla satır aynı dereceyi paylaştığı için RANK() sonuçlarında boşluklar oluşabilir; bu da bir sonraki dereceyi ileri taşır.
RANK() ile DENSE_RANK() arasındaki fark nedir?
RANK() eşitliklerden sonra boşluklar oluşturur; DENSE_RANK() ise boşluksuz ardışık dereceler atar.
RANK() ile ROW_NUMBER() arasındaki fark nedir?
RANK() eşitliklere izin verir; ROW_NUMBER() ise mükerrerler olsa bile her satıra benzersiz bir numara atar.
RANK() tüm veritabanlarında destekleniyor mu?
PostgreSQL, MySQL (8.0+), Microsoft SQL Server ve Oracle Database dahil olmak üzere çoğu modern veritabanı RANK() fonksiyonunu destekler.

