MySQL基于多个分组中的计数的热门项目

时间:2017-09-03 19:52:01

标签: mysql greatest-n-per-group

我正在尝试编写一个SQL查询,它将返回每个公司和每个位置的顶级项目。我有一个示例MySQL表(table_x),如下所示:

Date      | Company | Location | Item         | Price | Quantity | Total_Amount   
----------|---------|----------|--------------|-------|----------|-------------  
1/10/2000 | ABC     | 1        | Food         | 2     | 6        | 12    
1/11/2000 | ABC     | 1        | Food         | 1     | 2        | 2  
1/12/2000 | ABC     | 2        | Food         | 10    | 5        | 50    
1/13/2000 | ABC     | 2        | Electronics  | 100   | 2        | 200  
1/10/2000 | ABC     | 1        | Consumables  | 10    | 5        | 50    
1/15/2000 | ABC     | 2        | Electronics  | 100   | 3        | 300  
1/10/2000 | DEF     | 1        | Electronics  | 50    | 5        | 250    
1/16/2000 | DEF     | 1        | Electronics  | 50    | 4        | 200  
1/19/2000 | DEF     | 2        | Food         | 10    | 5        | 50    
1/14/2000 | DEF     | 2        | Food         | 2     | 10       | 20  
1/11/2000 | DEF     | 2        | Food         | 5     | 8        | 40    
1/11/2000 | DEF     | 2        | Electronics  | 500   | 2        | 1000

例如,我希望返回的是每个公司每个位置的最重要项目数。所以这样的事情,按计数的最重要的项目是每个公司和每个位置。

Company | Location | Item        | AVG(Price) | SUM(Total_Amount) | COUNT(*)  
--------|----------|-------------|------------|-------------------|---------  
ABC     | 1        | Food        | 4          | 14                | 2  
ABC     | 2        | Electronics | 100        | 500               | 2  
DEF     | 1        | Electronics | 50         | 450               | 2  
DEF     | 2        | Food        | 5.67       | 110               | 3  

我知道如何在所有公司和地点执行此操作,但无法将最重要的项目计入每个特定分组。理想情况下,如果我有更多的项目类型,我希望能够将其扩展到前N个项目。

这是我根据事件运行生成热门项目的SQL查询。

SELECT Company, Location, Item, AVG(Price), SUM(Total_Amount), COUNT(*) FROM table_x  
GROUP BY Company, Location, Item   
ORDER BY Company, Location, COUNT(*) desc

1 个答案:

答案 0 :(得分:1)

使用MySQL的非标准分组功能:

select * from (
    SELECT Company, Location, Item, AVG(Price), SUM(Total_Amount), COUNT(*) FROM table_x  
    GROUP BY Company, Location, Item   
    ORDER BY Company, Location, COUNT(*) desc
)
group by 1,2

使用MySQL(仅限)从列表中省略非聚合列时,将返回每个组合的第一行行。

请注意,自版本5.7.5起,您必须禁用ONLY_FULL_GROUP_BY,默认情况下已启用。

@Jeffrey已提供SQLFiddle