4.seminer ise
kitaplarından tandığımız İsmail ADAR hocanın semineriydi. Window functionları
konusunda örnekler yapıldı.
Bu konuda bütün
fonskiyonları yazmayacağım sadece Ranking Fonksiyonları yani derecelendirme
fonksiyonları üzerine bir şeyler yazmak istiyorum.
Ranking
fonksiyonları bir veri kümesi üzerinde kriter belirterek veri kümesinin
gruplara bölünmesini sağlayan ve her gruba geçici bir numara veren
fonksiyonlardır. SQL Server ile kullanılmaya başlayan ranking fonksiyonlarını
şu şekilde listeleyebiliriz.
ROW_NUMBER:Veri kümesindeki gruplanmış her
değer için numerik ve artan bir değer üretir. Bu değer istenirse tüm veri
kümesi bir parça olarak alınabilir yada veriler belli kolona göre
gruplanabilir.
SELECT
FirstName,LastName ROW_NUMBER() OVER (ORDER BY SalesYTD
DESC) AS 'Row Number',
SalesYTD,JobTitle
FROM Sales.vSalesPerson
DESC) AS 'Row Number',
SalesYTD,JobTitle
FROM Sales.vSalesPerson
SELECT
FirstName,LastName ROW_NUMBER() OVER (PARTITION BY JobTitle
ORDER BY SalesYTD
DESC) AS 'Row Number',
SalesYTD,JobTitle
FROM Sales.vSalesPerson
ORDER BY SalesYTD
DESC) AS 'Row Number',
SalesYTD,JobTitle
FROM Sales.vSalesPerson
RANK:fonksiyonuda ROW_NUMBER fonksiyonu gibi
bir veri kumesi icinde
gruplama yaparak her
bir veriyi belirtilen kritere gore siralama yaparak
numaralandirir.
ROW_NUMBER fonksiyonundan farki ise siralama yaparken ayni degere sahip olan
satirlara ayni sira
numarasi vermesidir. RANK fonksiyonunda siralama icin kullandigimiz alandaki
ayni
degerler icin ayni
sira numarasi kullanilir.
select
i.ProductID,p.Name,i.LocationID,i.Quantity,
RANK() OVER (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS
'RANK'
FROM
Production.ProductInventory i INNER JOIN Production.Product p
ON i.ProductID=p.ProductID
RANK() OVER (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS
'RANK'
FROM
Production.ProductInventory i INNER JOIN Production.Product p
ON i.ProductID=p.ProductID
DENSE_RANK fonksiyonu RANK fonksiyonundan
farklı olarak aynı sıra numarası verilse bile bir sonraki gelen kayda sıra
numarası verilirken araya tekrar eden kayıt sayısı kadar boşluk ekleyen
fonksiyondur.
select
i.ProductID,p.Name,i.LocationID,i.Quantity,
DENSE_RANK() OVER (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS
'RANK'
FROM
Production.ProductInventory i INNER JOIN Production.Product p
ON i.ProductID=p.ProductID where
i.ProductID in(436,461,443)
DENSE_RANK() OVER (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS
'RANK'
FROM
Production.ProductInventory i INNER JOIN Production.Product p
ON i.ProductID=p.ProductID where
i.ProductID in(436,461,443)
NTILE fonksiyonu diğer ranking yani derecelendirme fonksiyonlarından farklı
olarak veri kümesini gruplarken her bir grup içinde en fazla kayıt olacağı
bilgisini dışarıdan parametre olarak almaktadır.
SELECT p.FirstName,
p.LastName,s.SalesYTD,a.PostalCode,
NTILE(5) OVER(ORDER BY SalesYTD DESC) AS 'Ntile'
FROM Sales.SalesPerson s
INNER JOIN
Person.Person p ON s.BusinessEntityID=P.BusinessEntityID
INNER JOIN Person.Address a on a.AddressID=p.BusinessEntityID
NTILE(5) OVER(ORDER BY SalesYTD DESC) AS 'Ntile'
FROM Sales.SalesPerson s
INNER JOIN
Person.Person p ON s.BusinessEntityID=P.BusinessEntityID
INNER JOIN Person.Address a on a.AddressID=p.BusinessEntityID