Due to the use-case it seems better to split the code.
Create a table month_brand based on the following query:
select to_char(transaction_date, 'YYYY-MM') as yyyymm
,brand
,count (distinct unique_mem_id) as count_distinct_unique_mem_id
from source.table
group by yyyymm
,brand
;
Join month_brand with your source table:
select t.transaction_date, t.brand, t.Description, t.Amount, t.Amount / m.count_distinct_unique_mem_id as newval
from source.table as t
join month_brand as m
on m.yyyymm = to_char(t.transaction_date, 'YYYY-MM')
where t.description ilike '%Criteria%'
;
Instead of count(distinct ...)
, 2 phase solution:
- give row numbers to the duplicated unique_mem_id
- count only the unique_mem_id with row_number = 1
select *
into temp.table
from (SELECT transaction_date, brand, Description, Amount,
(Amount / count(case rn when 1 then unique_mem_id end) over (partition by to_char(transaction_date, 'YYYY-MM'),brand)) as newval
FROM (SELECT transaction_date, brand, Description, Amount,unique_mem_id
row_numner () over (partition by to_char(transaction_date, 'YYYY-MM'),brand,unique_mem_id) as rn
FROM source.table
)
)
WHERE DESCRIPTION iLIKE '%Criteria%'
;
partition by to_char(transaction_date, 'YYYY-MM')
You dont need to convert to char here, just use date_trunc:partition by date_trunc('month', transaction_date)
– wildplasser Oct 29 '16 at 18:06