WITH RankedSales AS (
SELECT
p.product_name,
c.category_name,
SUM(o.quantity) AS total_sales,
ROW_NUMBER() OVER (PARTITION BY c.category_name ORDER BY SUM(o.quantity) DESC) AS sales_rank
FROM
products p
JOIN
categories c ON p.category_id = c.category_id
JOIN
orders o ON p.product_id = o.product_id
WHERE
o.order_date >= '2022-10-01' AND o.order_date <= '2022-12-31'
GROUP BY
p.product_name, c.category_name
)
SELECT
category_name,
product_name,
total_sales
FROM
RankedSales
WHERE
sales_rank = 1
ORDER BY
category_name;
优化思路
- 使用CTE(Common Table Expression):通过CTE
RankedSales
计算每个产品在其所属类别中的销量排名,使得查询逻辑更加清晰。
- 窗口函数:在CTE中使用
ROW_NUMBER()
窗口函数,按照每个类别的总销量进行降序排列,并给每个产品在其类别内分配一个排名。这样可以方便地筛选出每个类别中销量最高的产品。
- JOIN操作:通过
JOIN
操作将products
表、categories
表和orders
表关联起来,确保数据的完整性。
- WHERE条件:通过
WHERE
条件筛选出2022年第四季度的订单数据,减少不必要的数据处理。
- 最终筛选和排序:在主查询中,只选择排名为1的产品(即每个类别中销量最高的产品),并按照类别名称排序。