You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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;

逻辑说明:

  1. monthly_product_sales CTE:一次性计算1997年每个月、每个产品的总销售额,和你原来的单月查询逻辑一致,只是去掉了单个月份的过滤条件。
  2. ranked_sales CTE:用RANK()窗口函数按月份分组,对每个月内的产品销售额从高到低排名。如果有多个产品当月销售额并列第一,RANK()会给它们都标记为1;如果只需要取任意一个最高销量产品,把RANK()换成ROW_NUMBER()即可。
  3. 最终查询:筛选出每个月排名为1的记录,就是当月销量最高的产品,最后按月份排序输出。

这个方案只需要扫描一次数据,比多次UNION的写法性能更优,也更易维护。

内容的提问来源于stack exchange,提问作者jordan_butler_33

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 09:25:26