4

我有orders带字段的表idcustomer_id并且amt

SQL小提琴

我想获得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

4 回答 4

4

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

我看不出你的第二个查询有什么问题——还有其他方法可以做到,但你的可以正常工作。

于 2013-10-06T23:42:34.107 回答
4

当您选择一个字段时,某些版本的 SQL 会给您一个警告或错误,具有类似MAXor的聚合运算符SUM,并且您选择的字段没有出现在GROUP BY.

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

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

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

要了解为什么您尝试做的事情没有意义,请替换MAXSUM. 从如何解释聚合运算符的立场来看,MAX返回与实际行相对应的内容纯属巧合。 SUM例如,没有这个属性。

于 2013-10-06T23:44:15.157 回答
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 不会影响服务器选择每个组中的哪些值。

于 2013-10-06T23:45:02.353 回答
1

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

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

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

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

于 2013-10-06T23:45:23.187 回答