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

如何筛选出每年销售额最高的月份?SQL实现求助

解决思路:筛选每年销售额最高的月份

基于你已有的月度销售额CTE,最直接的方式是使用窗口函数对每个年份内的月份按销售额排序,再筛选出排名第一的记录。以下是两种常用实现方式:

方法1:使用ROW_NUMBER()(仅返回单个最高月份)

如果每年只需要返回销售额最高的一个月份(若有并列最高,仅取其中一条),用ROW_NUMBER():

WITH sales_year_and_month AS (
    SELECT 
        year, 
        month, 
        SUM(orders_table.product_quantity * dim_products.product_price_in_£) AS total_sales 
    FROM public.dim_date_times
    JOIN public.orders_table ON public.orders_table.date_uuid = public.dim_date_times.date_uuid
    JOIN public.dim_products ON public.dim_products.product_code = public.orders_table.product_code
    GROUP BY year, month
),
ranked_sales AS (
    SELECT 
        year,
        month,
        total_sales,
        ROW_NUMBER() OVER (PARTITION BY year ORDER BY total_sales DESC) AS sales_rank
    FROM sales_year_and_month
)
SELECT year, month, total_sales
FROM ranked_sales
WHERE sales_rank = 1
ORDER BY year;

说明:

  • PARTITION BY year:按年份分组,每个年份单独排序
  • ORDER BY total_sales DESC:在每个年份组内,按销售额从高到低排序
  • ROW_NUMBER()会给组内记录分配唯一排名,即使同年有多个月份销售额相同,仅保留一条

方法2:使用RANK()(保留并列最高的月份)

如果需要保留同年所有销售额并列最高的月份,改用RANK():

WITH sales_year_and_month AS (
    SELECT 
        year, 
        month, 
        SUM(orders_table.product_quantity * dim_products.product_price_in_£) AS total_sales 
    FROM public.dim_date_times
    JOIN public.orders_table ON public.orders_table.date_uuid = public.dim_date_times.date_uuid
    JOIN public.dim_products ON public.dim_products.product_code = public.orders_table.product_code
    GROUP BY year, month
),
ranked_sales AS (
    SELECT 
        year,
        month,
        total_sales,
        RANK() OVER (PARTITION BY year ORDER BY total_sales DESC) AS sales_rank
    FROM sales_year_and_month
)
SELECT year, month, total_sales
FROM ranked_sales
WHERE sales_rank = 1
ORDER BY year;

说明:

  • RANK()会给并列的记录分配相同排名,比如同年有两个月份销售额都是最高,它们的sales_rank都会是1,都会被筛选出来

补充:子查询替代CTE写法

如果不想嵌套CTE,也可以将排名逻辑直接写在子查询中:

SELECT year, month, total_sales
FROM (
    SELECT 
        year, 
        month, 
        SUM(orders_table.product_quantity * dim_products.product_price_in_£) AS total_sales,
        RANK() OVER (PARTITION BY year ORDER BY SUM(orders_table.product_quantity * dim_products.product_price_in_£) DESC) AS sales_rank
    FROM public.dim_date_times
    JOIN public.orders_table ON public.orders_table.date_uuid = public.dim_date_times.date_uuid
    JOIN public.dim_products ON public.dim_products.product_code = public.orders_table.product_code
    GROUP BY year, month
) AS ranked_sales
WHERE sales_rank = 1
ORDER BY year;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:16:11