“使用MAX功能时选择与GROUP BY不一致的列表]

问题描述 投票:0回答:3

我不知道为什么这个不起作用:

SELECT stat1, max(stat2)
FROM games
WHERE stat3= x;

但是确实:

SELECT max(stat2)
FROM games
WHERE stat3= x;

im是sql和函数的新增功能,所以我不太了解该错误要指示或解决的问题。(我收到错误消息“选择列表与GROUP BY不一致;将GROUP BY子句修改为stat1”)

sql group-by max
3个回答
2
投票

请研究如何在sql中使用聚合函数。第一个查询应该有一个分组依据。标记适当的数据库以进一步为您提供帮助。

SELECT stat1, 
       max(stat2) AS MaxStat2
  FROM games
 WHERE stat3= x
 GROUP BY stat1;

1
投票

SELECT stat1 FROM ..本身意味着为所有匹配的行返回stat1的各个值。它将为WHERE子句选择的每一行产生一个输出行。

SELECT max(stat2) FROM ..本身意味着在所有匹配的行中找到stat2的最大值。无论查询处理了多少输入行,它都会产生一个输出行。

SELECT stat1, max(stat2) FROM ..显然是不一致的。第一个表达式表示我们想要很多行。第二个表达式表示我们想要一行。

如果将GROUP BY stat1添加到查询中,则可以解决不一致问题。它指示应按stat1的值将输入行分组在一起,并且应针对每个组分别计算max(stat2)


1
投票

select子句中的每个非聚合表达式必须出现在group by子句中。

第二个查询在select子句中只有一个表达式,它是一个聚合函数-因此不需要group by子句。对于stat2与参数匹配的行,这将为您提供stat3的最大值。

第一个查询在select子句(stat1)中有一个非聚合表达式,而没有group by子句,这使其成为无效的SQL。如果想要最大stat2 *每个stat1的不同值,则在查询中添加group by子句:

SELECT stat1, max(stat2) FROM games WHERE stat3= x GROUP BY stat1;

另一方面,如果您想知道stat1达到最大值的stat2的值是什么,那么它就不同了;这称为greatest-n-per-group问题,您可以通过过滤而不是汇总来解决它,如下所示:

select g.*
from games g
where 
    g.stat3 = :x
    and g.stat2 = (select max(g1.stat2) from games g1 where g1.stat3 = :x)
© www.soinside.com 2019 - 2024. All rights reserved.