with a as(
    select 
        product_id,
        product_name,
        category_id,
        sales_amount,
        round((sales_amount-cost_amount)/sales_amount,2) as profit_rate,
        rank() over(partition by category_id  order by sales_amount desc) as rk
    from product_category join sales_and_profit using(product_id)
)
select 
    product_id,
    product_name,
    category_id,
    sales_amount,
    profit_rate
from a
where profit_rate>=0.2 and rk<=3
order by category_id,sales_amount desc,product_name;