首页 > 解决方案 > 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 个不同的前两个列表(每个月一个)组成,所有这些都在一个查询中。

如果这很简单,我真的轰炸了我的面试,但任何帮助将不胜感激。希望这是可以理解的

标签: mysql

解决方案


使用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表达式来对文本月份缩写进行排序。


推荐阅读