Over Partition
Merhabalar,
Bugün plsql group by sorgusu içinden tek satırı DA almayı anlatacağım bir sorgu örneği paylaşacağım.
Örneğin sizin çalıştığınız şirkette de taksitle ödeme mantığı var ve nümerik alan yuvarlamasından dolayı son taksitin ilk taksite eşit olmaması durumu var ise (148,38 tl tutarlı bir ödemenin 12 taksit olduğu durum, taksit 12,365 ten 12,37 olur ve son taksit 12.31 olur ) taksitin belli miktarı ödendikten sonra yanlışlıkta tüm taksitleri bir schedule ile ödediğimizi varsayalım :D. Son 6 taksitin hepsini tek seferde ödediğimizi çok fazla veri olduğundan aslında bu 6 verinin toplamından en son az olan verinin de select ile alınması gerektiği bir durumu varsayalım.
veyahut daha iyi anlaşılması adına, bir veriyi çok fazla kişi değiştirebildiğini ve hepsinin loglandığını düşünelim bize tüm değişiklikleri bulmamız gerektiğini ayrıca ilk değiştirenin de belirtilmesi gerektiğini var sayarsak bunu nasıl yapabiliriz. Over(partition) yapısı ile nasıl yapılır bir bakalım.
ilk örnekten gidersek:
select sum(h.tutari), h.transactionid, p.geciciid, (select a.tutari from (select row_number() over(partition by transactionid order by id desc)
sira, l.tutari, l.transactiontid from taksitislem l) a where sira = 1 and a.transactionid = h.transactionid) as kalacak from taksit p, taksitislem h where p.id = h.taksitodenmeid and p.baslangictarihi <> p.islemtarihi and h.kayittarihi= to_date('08.09.2017', 'dd.mm.yyyy') group by h.transactiontid, p.geciciid
taksit ve taksitislem tablolarımızı join koşulu ile bağladıktan sonra taksit ödeme tablomuzu işlem tarihi ve başlangıç tarihi aynı olmaması gerektiğini var sayalım.kayıt tarihi 08.09.2017 olduğunu da var sayalım ve tablomuzun transaction id si ile gecici id si ile grouplama yaptığımızı varsayalım.
üstteki örnekte belirttiğim gibi 6 taksiti tutar alanına SUMatarak aldığımızı varsayalım. ben id alanını sıra ile doldurduğumdan son az olan taksit tutarının id si en büyük olmaktadır, bu alan yerine tarih vererek en büyük ya da ihtiyaca göre en küçük de diyebilirsiniz. Ana sorgumuzun transaction id si ile yada gruplamaya yardımcı olan başka bir eleman ile ( tek group by elemanı ile grouplayıp onun ile over partitionu bağlamak daha mantıklı olacaktır. Ben an itibari ile kulandığım tablo üzerinden gittim) de yapılabilir. Görüldüğü gibi aslında mnatık transacionid ye göre partition edip (yani bir araya toplayıp diyebiliriz) o partition içinde id ye göre büyükten küçüğe sıralayıp bunu sıra değişkenine atayıp sıra=1 diyerek ilk elemanı çekip sorgumun sonucuna toplam tutar group elemanları ve bu gruptaki son taksiti yansıtabildim.
Yine recorddate alanları gibi sıralanabilir alanlar kullanarak grouplanmış sonuçlar içinden istenilen bir satırın bir elemanını ek olarak sorgu sonucuna bu yöntem ile bağlayabilirsiniz.
Hiç yorum yok :
Yorum Gönder