2013-10-06 121 views
4

我有表orders與領域idcustomer_idamt如何使用MAX()返回具有最大值的行?

SQL Fiddle

我想獲得customer_idamt最大AMT和價值。

我做了查詢:

SELECT customer_id, MAX(amt) FROM orders; 

但這種查詢的結果包含的customer_id不正確的值。

然後我建立這樣的查詢:

SELECT customer_id, MAX(amt) AS maximum FROM orders GROUP BY customer_id ORDER BY maximum DESC LIMIT 1; 

,並得到正確的結果。

但我不明白爲什麼我的第一個查詢不能正常工作我在做什麼錯?

是否有可能改變我的第二個查詢,以獲得必要的信息給我一個更簡單和勝任的方式?

回答

4

MySQL將允許您離開查詢GROUP BY,從而返回整個表中的MAX(amt)任意customer_id。大多數其他RDBMS在使用聚合時需要使用GROUP BY子句。

我沒有看到你的第二個查詢有什麼問題 - 還有其他方法可以做到,但你的工作正常。

+0

第二個查詢的問題是它只會返回一個客戶(可能會有關係)。這對OP來說可能沒問題,但應該指出。 – BellevueBob

4

當您選擇某個字段時,某些版本的SQL會給您一個警告或錯誤,使其具有像MAXSUM這樣的聚合運算符,並且您選擇的字段未出現在GROUP BY中。

您需要一個更復雜的查詢來獲取與最大值對應的customer_id。不幸的是,SQL不如你想像的那麼幼稚。一旦這樣做是這樣的:

select customer_id from orders where amt = (select max(amt) from orders); 

雖然使用連接的解決方案可能會更高性能。

要理解你爲什麼試圖做的沒有意義,請用替換MAX。從聚合運算符的解釋的立場來看,MAX返回與實際行相對應的內容僅僅是巧合。例如,SUM沒有此屬性。

+0

我認爲這是最好的解決方案,但請注意,它會以最大的回報率返回所有客戶;換句話說,你可能會得到多行。 – BellevueBob

1

實際上,您的第一個查詢可以看作是將GROUP BY編輯爲一個大的單個組。 另外,MySQL可以自由選擇來自同一組的不同源行的每個輸出值。

http://dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html

MySQL的擴展使用GROUP BY的,這樣的選擇列表可參考 在GROUP BY子句中未命名的非聚合列。 服務器可以自由選擇每組中的任何值,因此 除非它們相同,否則所選值是不確定的。 此外,每個組的值的選擇不能受到添加ORDER BY子句影響的 的影響。結果集 的排序發生在選擇了值之後,並且ORDER BY不影響 服務器選擇的每個組內的值。

1

MAX()的問題在於,它會單獨考慮指定的字段來選擇該指定字段的最高值。在同一行中的其他值在任何程度上都沒有考慮或優先考慮結果。 MySQL通常會返回GROUP第一行的任何值(在這種情況下,GROUP由整個表sinse組成,沒有指定組),在聚集過程中刪除其他行的信息。

爲了解決這個問題,你可以這樣做:

SELECT customer_id, amt FROM orders ORDER BY amt DESC LIMIT 1 

它應該返回你的customer_id並同時保留雙方之間的關係的最高amt,因爲沒有agregation製成。

相關問題