首页 > 解决方案 > 如何选择时间范围内每个月按 SUM 排序的前几项?

问题描述

目前,我的查询如下所示:

SELECT TOP 1000 
    Yr, Mnth, Product, SUM(Price * Amount)
FROM
    (SELECT 
         Random_product_name AS Product, Random_price AS Price, 
         Random_quantity AS Amount,
         Random_order_dt AS Order_date, 
         YEAR(Random_order_dt) AS Yr, MONTH(Random_order_dt) AS Mnth
     FROM 
         Random_table_1 a
     JOIN 
         Random_table_2 b ON a.Random_ID = b.Random_ID
     WHERE 
         a.Random_product_name LIKE 'XX_%' 
         AND a.Random_country = 'XX'
         AND a.Random_price != 0 
         AND b.Random_order_dt BETWEEN 'Jan 01 2019 12:00AM' AND 'Jul 01 2021 12:00AM') x
GROUP BY 
    Yr, Mnth, Product
ORDER BY 
    Yr, CONVERT(INT, Mnth), CONVERT(INT, SUM(Price*Amount)) DESC

不用注意细节,真实的查询当然看起来有点不同。但它的结果可能如下所示:

产品
2019 1 一个 100 000
2019 1 90 000
2019 1 C 80 000
2019 1 D 70 000
2019 1 60 000
2019 1 F 50 000
2019 1 G 40 000
2019 2 120 000
2019 2 一个 110 000
2019 2 D 90 000
2019 2 C 80 000
2019 2 60 000
2019 2 G 30 000
2019 2 F 20 000

依此类推,直到 2021 年 7 月。产品总和每个月都在变化,我想要实现的是每个月只显示其中的前 3 个,但在一个表中,如下所示:

产品
2019 1 一个 100 000
2019 1 90 000
2019 1 C 80 000
2019 2 120 000
2019 2 一个 110 000
2019 2 D 90 000

等等。同样,直到 2021 年 7 月。

查询被简化。实际上它看起来有点复杂,但我希望它可以理解我想要完成的事情。我不知道如何继续,所以我很感激你能提供任何帮助!先感谢您!

标签: sqlsoql

解决方案


您可以在 select 语句中使用 row_number 和 partition_by 子句,然后在 where 子句中使用结果。

要添加到顶部选择:

 row_number() over(partition by Yr, Mnth order by SUM(Price * Amount) desc) as rownum

然后使用以下 where 子句在顶部添加一个选择:

WHERE rownum <= 3

推荐阅读