sql - 如何选择时间范围内每个月按 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 月。
查询被简化。实际上它看起来有点复杂,但我希望它可以理解我想要完成的事情。我不知道如何继续,所以我很感激你能提供任何帮助!先感谢您!
解决方案
您可以在 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
推荐阅读
- node.js - 猫鼬模式中的出生日期
- python - 在 gitpython 的最新提交中打印更改的文件路径
- spring-boot - 在 Spring Boot 中使用 GoDaddy SSL 证书
- oracle - 如何访问 12c 报告元数据?
- php - Laravel 6 | 可配置的作业,将模型附加到作业
- python - peewee:如何根据另一个表中跨行的值过滤表中的数据
- ktor - 如何使用 Kotlin Multiplatform(Android, iOS) Ktor Client 实现自定义缓存机制
- haskell - 如何在光泽中绘制图片的边界矩形?
- asp.net - 如何在后面的中继器代码中访问 TextBox 的 id
- c# - 在 .NET Standard 2.0 中找不到 NetSuiteService 类