I have a table with products, product_group and price level. How can I find the product group with the highest porportion of expensive items?
x
product | product_group | price_level
1 a expensive
2 a low
3 b low
4 b expensive
5 b expensive
6 c expensive
I have tried this query, but it keeps all price_levels, not just the expensive ones.
select product, product_group, price_level,
count(price_level) over (partition by product_group, price_level) as pl,
count(product) over (partition by product_group) as p
from tbl
Essentially, I want to divide the number of expensive items in one product group by the total number of items in the same product group.
Desired output:
Product group | Percentage
c 1
Advertisement
Answer
You can use conditional aggregation:
select product_group,
avg( (price_level = 'expensive')::int ) as expensive_ratio
from tbl
group by product_group
order by expensive_ratio desc
limit 1;
The use of avg()
is a convenient way to get the ratio you want. A more verbose method would be:
count(*) filter (where price_level = 'expensive') * 1.0 / count(*)