mysql - MYSQL - 具有限制并按两个字段分组的有序查询
问题描述
我最初发布了这个,但一切都是错误的(不清楚,没有例子等)所以我花时间把它放在一起并正确地问这个。
这是我在一次技术面试中的一个问题,我很失败。我需要一些关于如何做到这一点的见解。
样品表是这样的......
表(订单)
字段 = 订单 ID | 公司 | 出售 | 月
Orders
Order ID | Company | Sale | Month
1 | A | 7 | Jan
2 | A | 3 | Feb
3 | B | 2 | Feb
4 | B | 8 | Jan
5 | C | 4 | Feb
6 | C | 6 | Jan
7 | B | 3 | Mar
8 | C | 6 | Mar
9 | A | 7 | Mar
输出将是这样的:
Company | Sale | Month
B | 8 | Jan
A | 7 | Jan
C | 4 | Feb
A | 3 | Feb
A | 7 | Mar
C | 6 | Mar
我如何获得每月销售额排名前两名的公司?(我们的目的是 3 个月)
所以我尝试了这个
SELECT
Company,
SUM(Sale) AS Total,
Month
FROM Orders
Group by Month, Company
ORDER BY Total DESC;
请注意,至少有 3 家公司,一个公司在一个月内可能有多行。
如果我限制 6 个,则不一定包括所有月份。(如果某些月份更好,例如,我可以在其中一个月份获得 3 个条目,整个 1 月都比 2 月好)
我得到了使用子查询的提示,但即便如此我还是有点迷茫。
我尝试做一个返回两家公司的子查询,但请注意,相同的前两个公司列表在所有月份都不会相同
因此,我的预期输出是 6 行,其中包含不同的公司(并不总是相同的 2 个),并且以不同的顺序,具有不同的销售额,由 3 个不同的前两个列表(每个月一个)组成,所有这些都在一个查询中。
如果这很简单,我真的轰炸了我的面试,但任何帮助将不胜感激。希望这是可以理解的
解决方案
使用ROW_NUMBER
:
WITH cte AS (
SELECT Company, SUM(Sale) AS Total, Month,
ROW_NUMBER() OVER (PARTITION BY Month
ORDER BY SUM(Sale) DESC) rn
FROM Orders
GROUP BY Month, Company
)
SELECT Company, Total, Month
FROM cte
WHERE rn <= 2
ORDER BY
FIELD(Month, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'),
Total DESC;
演示
注意:为月份维护适当的日期列会更好。这样,要按月份排序,您就不必诉诸丑陋的FIELD
表达式来对文本月份缩写进行排序。
推荐阅读
- asp.net - 从局部视图中对控制器的 AJAX 调用
- git - 在 IntelliJ 中显示 Git 冲突
- html - 如何在报表oracle html中将表格文本居中
- sensors - OMnet++ 上的 INet 传感器节点
- c# - C#中expando对象的可选链接
- bitbucket-pipelines - 通过带有参数的 API 调用 Bitbucket 管道
- performance - AzureDevOps onPremise,Workspacemapping 真的很慢
- python - 带有 Python 脚本的 ETL 管道,在哪里托管?
- sockets - TwinCat3 - TCP/IP 随机断开连接
- ios - 为什么我不能在 iOS 上离开键盘以在 React Native App 中发送帖子?