求助:Northwind数据库PostgreSQL复杂SELECT查询(新手)
解决方案:单条查询获取1997年每月销量最高产品
可以借助PostgreSQL的窗口函数实现,无需重复写12条查询再UNION,完整语句如下:
WITH monthly_product_sales AS ( SELECT CAST(EXTRACT(MONTH FROM o.orderdate) AS integer) AS Month, p.productname, ROUND(CAST(SUM(od.quantity * od.unitprice) AS numeric), 2) AS SalesForMonth FROM order_details od INNER JOIN orders o ON od.orderid = o.orderid INNER JOIN products p ON od.productid = p.productid WHERE EXTRACT(YEAR FROM o.orderdate) = 1997 GROUP BY Month, p.productname ), ranked_sales AS ( SELECT Month, productname, SalesForMonth, RANK() OVER (PARTITION BY Month ORDER BY SalesForMonth DESC) AS sales_rank FROM monthly_product_sales ) SELECT Month, productname, SalesForMonth FROM ranked_sales WHERE sales_rank = 1 ORDER BY Month;
逻辑说明:
monthly_product_salesCTE:一次性计算1997年每个月、每个产品的总销售额,和你原来的单月查询逻辑一致,只是去掉了单个月份的过滤条件。ranked_salesCTE:用RANK()窗口函数按月份分组,对每个月内的产品销售额从高到低排名。如果有多个产品当月销售额并列第一,RANK()会给它们都标记为1;如果只需要取任意一个最高销量产品,把RANK()换成ROW_NUMBER()即可。- 最终查询:筛选出每个月排名为1的记录,就是当月销量最高的产品,最后按月份排序输出。
这个方案只需要扫描一次数据,比多次UNION的写法性能更优,也更易维护。
内容的提问来源于stack exchange,提问作者jordan_butler_33
相关产品推荐
相关产品推荐

