with sales_amount_rank as (
    select
            sp.product_id,
            pc.product_name,
            pc.category_id,
            sp.sales_amount,
            sp.cost_amount,
            row_number() over(partition by category_id order by sales_amount desc) as rn
    from 
            sales_and_profit as sp
    left join 
            product_category as pc
    on 
            sp.product_id = pc.product_id
)
select
        product_id,
        product_name,
        category_id,
        sales_amount,
        round((sales_amount - cost_amount) / sales_amount,2) as profit_rate
from 
        sales_amount_rank
where 
        rn <= 3
and 
        (sales_amount - cost_amount) / sales_amount > 0.2
order by 
        category_id,
        sales_amount desc,
        product_id