以下作品
s = select([tsr.c.kod]).where(tsr.c.rr=='10').group_by(tsr.c.kod)
并且这不是:
s = select([tsr.c.kod, tsr.c.rr, any fields]).where(tsr.c.rr=='10').group_by(tsr.c.kod)
为什么?
thx。
这不起作用,因为这样查询无效。
根据SQL标准,每列都必须位于group_by
中或需要一个汇总(即max()
,min()
,无论如何)。大多数数据库始终遵循此要求,但也有一些例外。
MySQL在这方面一直是奇怪的,在MySQL中,此行为取决于ONLY_FULL_GROUP_BY
设置:https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
我个人建议将sql_mode
设置设置为ANSI
。这样,您就可以很大程度上符合SQL标准,如果您将来需要使用(或迁移到)符合标准的数据库(例如PostgreSQL),这将对您有所帮助。
您尝试执行的操作在mysql中某种程度上有效,但在标准sql,postgresql和常识中无效。当按“ kod”对行进行分组时,组中的每一行都具有相同的“ kod”值,但“ rr”的值不同。使用聚合函数,您可以在此列中为每个组获取值的某些方面,例如
按kod从表组中选择kod,max(rr)
将为您提供'kod'的列表以及每个组中'rr'的最大值(按kod)。
令人遗憾的是,在select子句中,您只能放入group by子句中的列和/或聚合其他列中的函数。您可以将任何内容放在其中-用于过滤。您还可以在包含聚合函数表达式的组之后放置其他“ having”子句,这些表达式也可以用作组后过滤。