以下是满足需求的 SQL 查询及详细解释:

SELECT
  p.name AS product_name,
  SUM(o.quantity) AS total_sales,
  ROW_NUMBER() OVER (
    PARTITION BY p.category
    ORDER BY SUM(o.quantity) DESC, p.product_id ASC
  ) AS category_rank
FROM
  products p
JOIN
  orders o ON p.product_id = o.product_id
GROUP BY
  p.product_id, p.name, p.category
ORDER BY
  p.category ASC,
  total_sales DESC;

关键步骤解析:

表连接与聚合

JOIN orders o ON p.product_id = o.product_id
GROUP BY p.product_id, p.name, p.category

通过 product_id 关联商品表和订单表,并按商品粒度分组聚合计算总销量 SUM(o.quantity)。

窗口函数生成排名

ROW_NUMBER() OVER (
  PARTITION BY p.category
  ORDER BY SUM(o.quantity) DESC, p.product_id ASC
) AS category_rank

PARTITION BY p.category:按商品类别分区,每个类别独立计算排名。

ORDER BY SUM(o.quantity) DESC:分区内按总销量降序排列。

p.product_id ASC:销量相同时,按商品编号升序排序(确保排名稳定性)。

最终排序规则

ORDER BY p.category ASC, total_sales DESC

复制先按商品类别升序排列,再按总销量降序展示,使结果直观符合“排行榜”形式。