WITH product_sales AS (
SELECT
t1.product_id,
t1.product_name,
t1.category_id,
SUM(t2.sales_amount) AS sales_amount,
SUM(t2.cost_amount) AS cost_amount,
RANK() OVER (
PARTITION BY t1.category_id
ORDER BY SUM(t2.sales_amount) DESC
) AS sales_rank
FROM product_category t1
LEFT JOIN sales_and_profit t2
USING (product_id)
GROUP BY
t1.product_id,
t1.product_name,
t1.category_id
)
SELECT
product_id,
product_name,
category_id,
sales_amount,
round(((sales_amount - cost_amount) / sales_amount),2) AS profit_rate
FROM product_sales
WHERE
sales_rank <= 3
AND (sales_amount - cost_amount) / sales_amount > 0.2
ORDER BY
category_id ASC,
sales_amount DESC,
product_id ASC;