如何筛选出每年销售额最高的月份?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
相关产品推荐
相关产品推荐

