使用MAX功能时的"select list inconsistent with GROUP BY"



我不明白为什么这个不起作用:

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

但这确实是:

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

我是SQL和函数的新手,所以我不太了解该错误想要指示或修复的内容。 (我收到错误"选择列表与分组依据不一致;将 GROUP BY 子句修改为 stat1"(

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

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

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

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

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

如果向查询添加GROUP BY stat1,则会解决不一致问题。 它表示输入行应按stat1的值分组在一起,并且应为每个组独立计算max(stat2)

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

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

第一个查询在select子句 (stat1( 中有一个非聚合表达式,而没有group by子句,这使得它无效的 SQL。如果需要stat1的每个非重复值的最大stat2*,则向查询添加group by子句:

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

另一方面,如果你想知道stat2达到最大值的stat1的值是多少,那么它是不同的;这被称为每组最大n问题,你可以通过过滤而不是聚合来解决它,如:

select g.*
from games g
where 
g.stat3 = :x
and g.stat2 = (select max(g1.stat2) from games g1 where g1.stat3 = :x)

相关内容

最新更新