我正在尝试更改下面查询的计数 DISTINCT 部分,因为当前查询返回的 WINDOW 定义不受支持。使用 PostgreSQL 进行此计算的最无缝方法是什么?谢谢。
SELECT transaction_date, brand, Description, Amount, newval
into temp.table
FROM (SELECT transaction_date, brand, Description, Amount,
(Amount / count(DISTINCT unique_mem_id) over (partition by to_char(transaction_date, 'YYYY-MM'),brand
)) as newval
FROM source.table
)
WHERE DESCRIPTION iLIKE '%Criteria%';
最佳答案
由于用例,拆分代码似乎更好。
根据以下查询创建表month_brand:
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
;
将 month_brand 加入您的源表:
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%'
;
代替 count(distinct ...)
,两阶段解决方案:
- 为重复的 unique_mem_id 提供行号
- 只计算 row_number = 1 的 unique_mem_id
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%'
;
关于sql - 使用 PostgreSQL 区分计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40310628/