2013-12-13 38 views
1

我正在使用mysql。这里是一个表,我由例如:在每个中查找具有MAX值的记录

http://sqlfiddle.com/#!2/0ca23/1

在这个表中我有字段: CountryCityResourceVolumeother

我需要到选择记录其中包含MAXVolume字段的每个Resource每个City每个Country。 我已经试过这些查询:

SELECT `Country`, `City`, `Resource`, MAX(`Volume`), `other` 
    FROM `temp` 
    GROUP BY `Country`, `City`, `Resource` 

但数据搞砸了(在现场“其他”)。

要明确这就是我想要实现的。

http://sqlfiddle.com/#!2/0ad62a/1

我需要全程记录,其中包含MAXVolume值。

我已经阅读SQL Select only rows with Max Value on a Column,知道有一个INNER JOIN - 解决这个问题的方法,但是没有得到,怎么用多个分组来完成。 谢谢您的阅读。

回答

4

检查你的这个更新的小提琴:http://sqlfiddle.com/#!2/0ca23/4

SELECT temp.* 
FROM temp 
JOIN 
    (SELECT `Country`, `City`, `Resource`, MAX(`Volume`) AS MaxVol 
    FROM `temp` 
    GROUP BY `Country`, `City`, `Resource`) t 
    ON temp.country = t.country 
    AND temp.city = t.city 
    AND temp.resource = t.resource 
    AND temp.volume = t.MaxVol 

该查询基本上是做一个INNER与获取最大的子查询加入您的主表(卷)记录每个国家,城市和资源。子查询结果的别名如表t

+0

Thabk你!我会在我的实际桌上检查它,并让你知道结果 – NikVankevsky

1

由于您没有在other列中进行分组,因此MySQL会为您提供组内的随机值。事实上,其他RDBMS(如SQL Server)甚至不允许您选择一个没有聚合函数或组合的列。

因此,对于您的情况,解决方案取决于您想返回other列的内容。你只想要属于具有最大音量的组的值?在这种情况下,做这样的事情:

SELECT `Country`, `City`, `Resource`, `Volume`, `other` 
FROM `temp` t1 
WHERE `Volume` = (SELECT MAX(`Volume`) FROM `temp` t2 WHERE t1.`Country` = t2.`Country` 
        AND t1.`City` = t2.`City` AND t1.`Resource` = t2.`Resource`) 
+0

请注意,此解决方案可能比其他记录的方法更慢。 – Strawberry

+0

谢谢!它似乎也在工作。我会在工作台上检查它 – NikVankevsky

+0

再次,非常感谢您的帮助!你的变体也在工作,但需要更长的时间,这对我很重要,因为我有一张相当大的表(约55 000 000条记录) – NikVankevsky

0

还有一种使用MySQL功能的集合方式:User-Defined Variables

select Country, City, Resource, Volume,other 
from 
(
SELECT Country, City, Resource, Volume,other, 
if(@c1<>Country OR @c2<>City OR @c3<>Resource,1,0) 
    as FlagField, 
@c1:=Country, 
@c2:=City, 
@c3:=Resource 
FROM temp, (Select @c1:='',@c2:='',@c3:='') as t1 
ORDER BY Country, City, Resource,Volume DESC 
) t2 
WHERE FlagField=1 

SQLFiddle demo

此查询还解决了问题,当有多条记录与Value=MAX(Value)组。如果您使用JOIN子查询或WHERE Volume=(..MAX(Value)..)的方式,那么您还应该在主查询中使用(例如)另一个Group BY来处理此问题,以便每个组只留下一条记录。例如(@Aziz Shaikh查询):

SELECT temp.Country,temp.City,temp.Value,MAX(other) 
FROM temp 
JOIN 
    (SELECT `Country`, `City`, `Resource`, MAX(`Volume`) AS MaxVol 
    FROM `temp` 
    GROUP BY `Country`, `City`, `Resource`) t 
    ON temp.country = t.country 
    AND temp.city = t.city 
    AND temp.resource = t.resource 
    AND temp.volume = t.MaxVol 
GROUP BY temp.Country,temp.City,temp.Value 
+0

哦,谢谢,但对我来说这似乎太复杂了。我只需要一个maxValue – NikVankevsky

相关问题