是否出现在group by子句中或用于聚合函数?

时间:2018-02-17 22:31:18

标签: postgresql query-performance

我正在连接两个表,并按一个表中没有重复的列进行分组(尽管它可能与另一个表中的多个行链接)。如果我还选择此表的其他列,则需要在group by子句中列出它们,或者应用聚合函数。

select A.id, A.x, A.y, max(B.z) 
from A join B on A.id = B.id_ref
group by A.id

这会产生错误:额外的列(A.x, A.y)必须在group by子句中列出,或者包含在聚合函数(例如max)中。 两个选项都会生成相同的结果,因为id字段在表A中没有重复项(例如,它可能是行ID或主键)。

是否有任何关于我应该选择哪个选项的约定? (或者是否有更好的替代方法,例如distinct on或嵌套子查询?请注意,我仍然希望对另一个表B.z的列执行适当的聚合。)例如,将添加一个文本列(A.y)到组 - 通过减慢查询?或者哪个聚合函数的性能成本和可读性最低?

1 个答案:

答案 0 :(得分:1)

  

...表字段中的id字段没有重复项(例如,它可能是行ID或主键)。

如果id 是主键,Postgres允许跳过group by子句中表格的其他列,请参阅SqlFiddle.

如果id不是主键,则应列出group by子句中的其余列。它比将它们放在一个聚合体中更自然,也更有效。