Daha önce yazdığım SQL MAX MIN SUM İçin Farklı Alternatifler makaleye benzer olarak. Günlük raporlamada kolaylık sağlayacak bir ipucunu paylaşalım. Şu ana kadarki yazılarda en büyük, en küçük, ortanca, her gruptan n kayıt, rastgele seçim gibi ipuçlarını paylaştık. Bu yazı da herhangi bir grubun ilk ve son kayıtlarının kolayca nasıl bulacağımızı yazacağız. Bu amaç için Oracle cephesinde FIRST ve LAST isimli analitik fonksiyonlar bulunmaktadır. SQL Server 2005 ve sonrasında sunulan DENSE_RANK() fonksiyonu aracılığıyla bunları kolayca seçebiliriz. Bu fonksiyonu kullanarak her grubu içindeki 2. alana göre artan veya azalan sıralayacağız. Artan sıraladığımızda en son kayıtlar, azalan sıraladığımızda ilk kayıtlar “1¨ olarak numaralandırılacaktır.
Örnek olarak kullanacağımız Satış tablosunu yukarıdaki gibidir. Bu tabloyu Lokasyon alanına bölümlendirip Ay alanına göre artan şekilde numaralandıralım.
SELECT *, DENSE_RANK() OVER (PARTITION BY Lokasyon ORDER BY Ay) AS [Sıra Numarası] FROM Satis
Bu numarayı sub-query üzerinden filtreleyerek ilgili satırlara erişebiliriz.
SELECT * FROM ( SELECT *, DENSE_RANK() OVER (PARTITION BY Lokasyon ORDER BY Ay) AS [Sıra Numarası] FROM Satis ) as T WHERE [Sıra Numarası]=1
En son kaydı bulmak için Ay alanını azalan olarak sıralamamız yeterli olacaktır.
SELECT * FROM ( SELECT *, DENSE_RANK() OVER (PARTITION BY Lokasyon ORDER BY Ay DESC) AS [Sıra Numarası] FROM Satis ) as T WHERE [Sıra Numarası]=1