dersblog

Birikmeli (Cumulatif) Toplamlar ve SQL

Mesela dellstore2 tabaninda tum siparisler uzerindeki "aktif musterileri" bulmak istiyoruz. Aktif musterinin tanimi orders tablosunda olmaktan ibaret, o zaman tekil (unique) olarak

select count(distinct(customerid)) from orders

dersek, tum zamanlar icin gerekli rakami bulabiliriz. Fakat ya bize birikimsel (cumulative) olarak, ay bazinda yavas yavas buyuyen bir rakam bulmamiz istenseydi? O zaman Postgresql'in OVER (ORDER BY ...) numarasini kullanmamiz lazim. Dikkat, burada PARTITION komutu yok.

Fakat aklimiza ilk gelen basit kodlamayi yaparsak

select 

date_trunc('month',orderdate),

sum(count(distinct(customerid)))
   over (order by date_trunc('month',orderdate))

from orders group by date_trunc('month',orderdate) 

dogru sonucu almadigimizi goreceksiniz. Sebep farkli aylardaki customerid kayitlarinin toplami sisirmesidir. Tekil musteri sayisini aradigimiz icin bu bize dogru sonucu vermiyor. O zaman her customerid icin tek bir tarih kullanmamiz gerekir, tercihen musterinin ilk yaptigi siparisin ay kismi kullanilabilir. Ornek

SELECT  OrderDate,SUM(COUNT(DISTINCT customerid)) OVER (ORDER BY OrderDate)FROM
    (

 SELECT CustomerID,
        DATE_TRUNC('MONTH', MIN(OrderDate)) AS OrderDate
        FROM
    orders
        GROUP BY CustomerID) AS ordersGROUP BY OrderDate

Goruldugu gibi min(..) ile customerid icin mumkun olabilecek en erken tarih alinmis. Bu kod toplami duzeltecektir.


Yukarı