我不知道为什么这个不起作用:
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中使用聚合函数。第一个查询应该有一个分组依据。标记适当的数据库以进一步为您提供帮助。
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
子句。对于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)