ROW_NUMBER SQL İşlevi: Satır Numaraları Nasıl Gösterilir
ROW_NUMBER() SQL işlevi, bir sonuç kümesindeki satırlara artan tamsayılar atar; isteğe bağlı olarak veriyi bölümlere ayırır ve her bölüm içinde satırları sıralar.
SQL’de veri kümelerinin sırasız olması yaygındır; bu da analizi zorlaştırabilir. Bir veri kümesindeki satırların birbirleriyle ilişkisini anlamak için ROW_NUMBER() işlevini kullanabiliriz.
Bu işlev, bir sonuç kümesindeki satırlara ardışık numaralar atayarak sonraki düzenleme ve analizler için net bir sıra sağlar. Bu, veri kümesinin tamamı için veya veri kümesi içindeki farklı veri grupları için yapılabilir.
Bu makale, SQL temelleri konusunda ön bilgiye sahip olduğunuzu varsayar. Yaygın olarak kullanılan ROW_NUMBER() işlevinin temellerini ele alacak ve zorluk seviyesi artan örnekler sunacağız.
OVER (...): ROW_NUMBER() gibi pencere işlevleri için zorunlu olan deyimdir. Satır numaralarının hangi bağlamda hesaplandığını tanımlar.
PARTITION BY value_expression: Sonuç kümesini belirtilen sütun(lar) veya ifade(ler)e göre bölümlere ayıran isteğe bağlı deyimdir. Satır numaraları her bölüm içinde bağımsız olarak hesaplanır.
ORDER BY order_by_clause: Satır numaralarının her bölüm içinde (veya PARTITION BY kullanılmadıysa tüm sonuç kümesinde) hangi düzende atanacağını belirten isteğe bağlı deyimdir.
Örneklemek için, ROW_NUMBER() işlevini daha geniş bir SQL sorgusunda şöyle kullanabiliriz:
SELECT Val_1,
ROW_NUMBER()OVER(PARTITIONBY group_1,ORDERBY number DESC)AS rn
FROMData;Altyapı:
ROW_NUMBER() Örnekleri
Aşağıdaki üç örnekte ücretsiz DataLab IDE’sini kullanacağız. Employees örnek veri kümesini (DataLab’a zaten dâhil) kullanacağız; bu veri kümesinde şu dört sütun bulunur:
first_name: string alanı
last_name: string alanı
gender: iki değere sahip string alanı (“M” veya “F”)
hire_date: çalışanın işe alındığı tarih
Veri kümesini aşağıdaki SQL kodunu kullanarak sorgulayabiliriz:
SELECT e.first_name, e.last_name, e.gender, e.hire_date
FROM employees.employees e
LIMIT100;-- Optionally reduce the size of the outputAltyapı:
Çalışanları alfabetik sırayla numaralandırma
ROW_NUMBER() kullanmadan önce amacımızı tanımlamak önemlidir—bu, bölümlendirip bölümlendirmeyeceğimizi ve nasıl sıralayacağımızı netleştirir. Bu örnekte tüm çalışanları alfabetik olarak sıralamak istiyoruz. Veri kümesindeki tüm çalışanları sıraladığımız için bir PARTITION BY deyimine gerek yok. Müşterileri soyadlarına (last_name) göre sıralayacağız. Numaralandırma sütunumuza name_row_number adını vereceğiz.
Eşitlikleri (aynı soyada sahip çalışanlar) yönetmek için sıralamayı daha fazla sütun ekleyerek hassaslaştırabiliriz. Aşağıdaki örnekte önce last_name ile sıralıyor, bir çalışanın soyadı başkasıyla aynıysa bu durumda adlarına (first_name) göre sıralıyoruz.
Çalışanları cinsiyet içinde en yeni işe alım tarihine göre numaralandırma
Şimdi, çalışanları kendi cinsiyetleri içinde en yeni işe alımdan en eskiye doğru sıralayalım. Yine ORDER BY deyimini kullanarak hire_date ile sıralayacağız, ancak bu kez en yeni işe alınanları önceliklendirmek için azalan düzende (DESC) kullanacağız.
Her cinsiyet için ayrı numaralandırma yapmak amacıyla PARTITION BY gender deyimini ekleyeceğiz. Bu, her bir farklı cinsiyet için satır numaralarının 1’den yeniden başlaması anlamına gelir.
Daha sonra her cinsiyette en deneyimli çalışanı bulmak için bu veriyi bir WHERE deyimi kullanarak sorgulayabiliriz:
WITH RankedEmployees AS(SELECT e.first_name, e.last_name, e.gender, e.hire_date,
ROW_NUMBER()OVER(PARTITIONBY gender ORDERBY hire_date DESC)AS hire_row_number
FROM employees.employees e
)SELECT first_name, last_name, gender, hire_date
FROM RankedEmployees
WHERE hire_row_number =1;Altyapı:
Bir JOIN kullanarak çalışanları cinsiyet içinde ücrete göre sıralama
Son örneğimizde, çalışanları cinsiyetlerini dikkate alarak ücretlerine göre sıralayacağız. Bunu başarmak için employees tablosunu emp_no sütununa göre salaries tablosuyla birleştireceğiz:
SELECT e.first_name, e.last_name, e.gender, e.hire_date, s.salary
FROM employees.employees e
JOIN employees.salaries s ON e.emp_no = s.emp_no
LIMIT100;Altyapı:
Şimdi hem PARTITION BY hem de ORDER BY kullanacağız. Her cinsiyet için ayrı sıralamalar elde etmek üzere gender ile bölümleyecek, en yüksek kazananları önce sıralamak için de salary sütununu azalan düzende sıralayacağız.
Tam sorgu şu şekildedir:
SELECT e.first_name, e.last_name, e.gender, e.hire_date, s.salary,
ROW_NUMBER ()OVER(PARTITIONBY e.gender ORDERBY s.salary DESC)AS salary_row_number
FROM employees.employees e
JOIN employees.salaries s ON e.emp_no = s.emp_no
LIMIT100;Altyapı:
Her cinsiyet için en yüksek ücretleri karşılaştırmak üzere sonuçları bir WHERE deyimiyle filtreleyebiliriz. Aşağıdaki sorgu, her cinsiyet için en yüksek gelirli ilk 5 kişiyi, kendi cinsiyet grubundaki sırasına göre döndürecektir. Bu tür sorgular, veri kümesi içinde ücret eşitliği hakkında içgörüler sağlayabilir.
WITH RankedSalaries AS(SELECT e.first_name, e.last_name, e.gender, e.hire_date, s.salary,
ROW_NUMBER()OVER(PARTITIONBY e.gender ORDERBY s.salary DESC)AS salary_row_number
FROM employees.employees e
JOIN employees.salaries s ON e.emp_no = s.emp_no
)SELECT first_name, last_name, gender, hire_date, salary
FROM RankedSalaries
WHERE salary_row_number <=5ORDERBY salary_row_number, gender;Altyapı:
Sonuç
ROW_NUMBER() işlevi, sırasız bir veri kümesine sahip olduğumuzda ve satırlara sonraki analizler için net bir ardışık numaralandırma atamak istediğimizde kullanışlıdır. Bu numaraların belirli sırasını ORDER BY ile tanımlar, verideki farklı gruplar için ayrı numaralandırma dizilerini ise PARTITION BY ile belirleriz.
Bu makaleyi faydalı bulduysanız ve SQL hakkında daha fazla öğrenmek istiyorsanız diğer SQL kurslarımıza göz atın.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
SQL’de veri kümelerinin sırasız olması yaygındır; bu da analizi zorlaştırabilir. Bir veri kümesindeki satırların birbirleriyle ilişkisini anlamak için
ROW_NUMBER()işlevini kullanabiliriz.Bu işlev, bir sonuç kümesindeki satırlara ardışık numaralar atayarak sonraki düzenleme ve analizler için net bir sıra sağlar. Bu, veri kümesinin tamamı için veya veri kümesi içindeki farklı veri grupları için yapılabilir.
Bu makale, SQL temelleri konusunda ön bilgiye sahip olduğunuzu varsayar. Yaygın olarak kullanılan
ROW_NUMBER()işlevinin temellerini ele alacak ve zorluk seviyesi artan örnekler sunacağız.ROW_NUMBER()Söz DizimiROW_NUMBER()işlevinin temel söz dizimi şöyledir:Temel bileşenleri parçalara ayıralım:
ROW_NUMBER(): Ardışık satır numaraları üreten işlevin kendisidir.OVER (...):ROW_NUMBER()gibi pencere işlevleri için zorunlu olan deyimdir. Satır numaralarının hangi bağlamda hesaplandığını tanımlar.PARTITION BY value_expression: Sonuç kümesini belirtilen sütun(lar) veya ifade(ler)e göre bölümlere ayıran isteğe bağlı deyimdir. Satır numaraları her bölüm içinde bağımsız olarak hesaplanır.ORDER BY order_by_clause: Satır numaralarının her bölüm içinde (veyaPARTITION BYkullanılmadıysa tüm sonuç kümesinde) hangi düzende atanacağını belirten isteğe bağlı deyimdir.Örneklemek için,
ROW_NUMBER()işlevini daha geniş bir SQL sorgusunda şöyle kullanabiliriz:ROW_NUMBER()ÖrnekleriAşağıdaki üç örnekte ücretsiz DataLab IDE’sini kullanacağız. Employees örnek veri kümesini (DataLab’a zaten dâhil) kullanacağız; bu veri kümesinde şu dört sütun bulunur:
first_name: string alanılast_name: string alanıgender: iki değere sahip string alanı (“M” veya “F”)hire_date: çalışanın işe alındığı tarihVeri kümesini aşağıdaki SQL kodunu kullanarak sorgulayabiliriz:
Çalışanları alfabetik sırayla numaralandırma
ROW_NUMBER()kullanmadan önce amacımızı tanımlamak önemlidir—bu, bölümlendirip bölümlendirmeyeceğimizi ve nasıl sıralayacağımızı netleştirir. Bu örnekte tüm çalışanları alfabetik olarak sıralamak istiyoruz. Veri kümesindeki tüm çalışanları sıraladığımız için birPARTITION BYdeyimine gerek yok. Müşterileri soyadlarına (last_name) göre sıralayacağız. Numaralandırma sütunumuzaname_row_numberadını vereceğiz.Eşitlikleri (aynı soyada sahip çalışanlar) yönetmek için sıralamayı daha fazla sütun ekleyerek hassaslaştırabiliriz. Aşağıdaki örnekte önce
last_nameile sıralıyor, bir çalışanın soyadı başkasıyla aynıysa bu durumda adlarına (first_name) göre sıralıyoruz.Çalışanları cinsiyet içinde en yeni işe alım tarihine göre numaralandırma
Şimdi, çalışanları kendi cinsiyetleri içinde en yeni işe alımdan en eskiye doğru sıralayalım. Yine
ORDER BYdeyimini kullanarakhire_dateile sıralayacağız, ancak bu kez en yeni işe alınanları önceliklendirmek için azalan düzende (DESC) kullanacağız.Her cinsiyet için ayrı numaralandırma yapmak amacıyla
PARTITION BY genderdeyimini ekleyeceğiz. Bu, her bir farklı cinsiyet için satır numaralarının 1’den yeniden başlaması anlamına gelir.Tam sorgu şu şekildedir:
Daha sonra her cinsiyette en deneyimli çalışanı bulmak için bu veriyi bir
WHEREdeyimi kullanarak sorgulayabiliriz:Bir JOIN kullanarak çalışanları cinsiyet içinde ücrete göre sıralama
Son örneğimizde, çalışanları cinsiyetlerini dikkate alarak ücretlerine göre sıralayacağız. Bunu başarmak için
employeestablosunuemp_nosütununa göresalariestablosuyla birleştireceğiz:Şimdi hem
PARTITION BYhem deORDER BYkullanacağız. Her cinsiyet için ayrı sıralamalar elde etmek üzeregenderile bölümleyecek, en yüksek kazananları önce sıralamak için desalarysütununu azalan düzende sıralayacağız.Tam sorgu şu şekildedir:
Her cinsiyet için en yüksek ücretleri karşılaştırmak üzere sonuçları bir
WHEREdeyimiyle filtreleyebiliriz. Aşağıdaki sorgu, her cinsiyet için en yüksek gelirli ilk 5 kişiyi, kendi cinsiyet grubundaki sırasına göre döndürecektir. Bu tür sorgular, veri kümesi içinde ücret eşitliği hakkında içgörüler sağlayabilir.Sonuç
ROW_NUMBER()işlevi, sırasız bir veri kümesine sahip olduğumuzda ve satırlara sonraki analizler için net bir ardışık numaralandırma atamak istediğimizde kullanışlıdır. Bu numaraların belirli sırasınıORDER BYile tanımlar, verideki farklı gruplar için ayrı numaralandırma dizilerini isePARTITION BYile belirleriz.Bu makaleyi faydalı bulduysanız ve SQL hakkında daha fazla öğrenmek istiyorsanız diğer SQL kurslarımıza göz atın.