如何使用MAX()返回具有最大值的行?

时间:2013-10-06 23:37:25

标签: mysql sql

我的表格orders包含字段idcustomer_idamt

SQL Fiddle

我想让customer_id获得最大的amt和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 个答案:

答案 0 :(得分:4)

MySQL将允许您离开查询GROUP BY,从而使整个表中的MAX(amt)返回任意customer_id。大多数其他RDBMS在使用聚合时需要GROUP BY子句。

我认为您的第二个查询没有任何问题 - 还有其他方法可以做到,但您的工作正常。

答案 1 :(得分:4)

某些版本的SQL在您选择字段时会给您一个警告或错误,包含MAXSUM等聚合运算符,而您选择的字段不会出现在{{1}中}。

您需要一个更复杂的查询来获取与max amt相对应的customer_id。不幸的是,SQL并不像你想象的那么幼稚。一旦这样做就是:

GROUP BY

尽管使用连接的解决方案可能更具性能。

要了解为什么您尝试做的事情没有意义,请将select customer_id from orders where amt = ( select max(amt) from orders); 替换为MAX。从如何解释聚合运算符的立场来看,SUM返回与实际行相对应的东西仅仅是巧合。例如,MAX没有此属性。

答案 2 :(得分:1)

实际上,您的第一个查询可以看作是GROUP BY-ed成为一个大的单个组。 此外,MySQL可以自由选择来自同一组的不同源行的每个输出值。

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

  

MySQL扩展了GROUP BY的使用,以便选择列表可以引用   未在GROUP BY子句中命名的非聚合列。   服务器可以自由选择每个组中的任何值,所以   除非它们相同,否则所选择的值是不确定的。   此外,不能从每个组中选择值   受添加ORDER BY子句的影响。对结果集进行排序   选择值后发生,ORDER BY不影响   服务器选择的每个组中的值。

答案 3 :(得分:1)

MAX()的问题在于,只考虑指定的字段,它将选择该指定字段的最高值。在任何程度上,不考虑或优先考虑同一行中的其他值。 MySQL通常会返回GROUP的第一行的任何值(在这种情况下,GROUP由整个表组成,没有指定组),在聚合期间删除其他行的信息

要解决这个问题,你可以这样做:

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

它应该返回customer_id和最高amt,同时保留两者之间的关系,因为没有进行任何聚合。