2013-12-13 39 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

相關問題