with t as (
    select a.product_id, product_name, category_id, 
    sum(sales_amount) as sales_amount, 
    round((sum(sales_amount)-sum(cost_amount))/sum(sales_amount), 2) as profit_rate
    from product_category a
    join sales_and_profit b on a.product_id=b.product_id
    group by a.product_id, product_name, category_id
)
select product_id, product_name, category_id, sales_amount, profit_rate
from (
    select product_id, product_name, category_id, sales_amount, profit_rate,
    row_number() over (partition by category_id order by sales_amount desc) as rn
    from t
) temp
where rn<=3 and profit_rate>0.2
order by category_id