SQL Server’da Distinct ile Row_Number Fonksiyonu Kullanımı
Herkese merhaba,
Bu yazıda SQL Server’da Distinct ile Row_Number fonksiyonu kullanımından bahsedeceğim.
Aslında bu makaleyi yazma fikri kod yazarken ortaya çıktı.
Bir tablodan veri çekerek başka bir tabloya insert işlemi yapıyordum. Tabi ki bu tablo üzerinde tekrar eden satırlar mevcuttu. Bu satırları Distinct yardımı ile teke düşürdüm fakat Row_Number fonksiyonunu uyguladığım zaman tekrar eden satırların yeniden geldiğini aslında Distinct yapamadığımı fark ettim.
Konu hakkında acaba benim gibi hata yapan oldu mu diye aranırken aslında pek de bir şey bulamadım. Sadece küçük bir örnek gözüme çarptı ve bu örnekten yola çıkarak sorgumu başarı ile oluşturdum. (Tabi bu yazı İngilizceydi ve hemen Türkçe bir makale yazma gereği duydum.)
Şimdi bu işlemi Northwind veritabanını kullanarak örneklendirmeye çalışacağım ki sizin de başınıza gelirse benzer çözüm uygulayabilirsiniz.
Northwind veritabanı üzerinde kullanacağım tablo [Order Details] tablosudur.
Şimdi bu tabloya Select çekelim.
SELECT *
FROM dbo.[Order Details];
Sonucu aşağıda görmektesiniz. Tekrar eden satırlar mevcut.
Toplam satır sayısını incelediğimizde ise 2155 satır olduğunu görmektesiniz.
Şimdi tablomuzda OrderID alanına Distinct çekerek kaç satır veri geldiğini tekrar kontrol edelim. Sorgusu aşağıdadır.
SELECT DISTINCT
OrderID
FROM dbo.[Order Details];
Sorguyu çalıştırdığınız zaman aşağıdaki sonucu göreceksiniz.
Görüldüğü üzere satırlar teke düşmüş oldu. Toplam satır sayısını kontrol edelim.
Toplam satır sayısı 830 geldi.
Şimdi gelelim esas meseleye. OrderID sütunundan sonra Row_Number fonksiyonunu kullanalım. Kodu aşağıda görmektesiniz.
SELECT DISTINCT
OrderID,
ROW_NUMBER() OVER (ORDER BY OrderID ASC) AS SıraNo
FROM dbo.[Order Details];
Kodu çalıştırdığımız zaman Distinct ifadesinin çalışmadığını göreceksiniz. Sonucu aşağıda görmektesiniz.
Görüldüğü üzere 2155 satır sonuç geldi. Bizim istediğimiz bu değildi. 830 satır gelmesini ve Row_Number fonksiyonunun 1’den başlayıp 830’a kadar numara vermesini istiyoruz.
Peki çözümü nasıl sağlayacağız?
Çözümü Distinct ifadesi ile bir sorgu oluşturmak ve bunu bir tablo gibi gösterip (iç tablo haline getirmek) dış tabloda Row_Number fonksiyonunu kullanmak.
Ne demek istiyorum kod üzerinde görelim.
SELECT ICTABLO.OrderID,
ROW_NUMBER() OVER (ORDER BY ICTABLO.OrderID) AS SıraNo
FROM
(SELECT DISTINCT OrderID FROM dbo.[Order Details]) AS ICTABLO;
Sorguyu çalıştırdığınız zaman aşağıdaki sonucu göreceksiniz.
Görüldüğü üzere istediğimiz gibi kayıtları teke düşürüp numaralandırdık.
Herkese çalışma hayatında ve yaşamında başarılar kolaylıklar.