Postgresql 错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用

Posted

技术标签:

【中文标题】Postgresql 错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用【英文标题】:Postgresql error: column must appear in the GROUP BY clause or be used in an aggregate function 【发布时间】:2020-11-04 01:18:09 【问题描述】:

我想从中获取“user1”最近联系人的消息表,现在该表如下所示:

| id | receiver | sender | time       |
|----|----------|--------|------------|
| 1  | user1    | host1  | 2020-07-02 |
| 2  | host2    | user1  | 2020-07-03 |
| 3  | user3    | host3  | 2020-07-04 |

我设法通过使用 mysql 得到了预期的结果:

SELECT CASE WHEN receiver = 'user1' THEN sender ELSE receiver END AS id, max(time) AS time 
FROM message WHERE receiver = 'user1' OR sender = 'user1' 
GROUP BY CASE WHEN receiver = 'user1' THEN sender ELSE receiver END;

但是当我在 postgres 上运行此查询时,我收到错误:Postgresql 错误:列接收器必须出现在 GROUP BY 子句中或用于聚合函数中。有什么办法可以解决这个问题?

【问题讨论】:

您的查询按照 PostgreSQL 编写的方式工作:db-fiddle.com/f/c648pLyq1N4yQTDcBMUfeM/0 是的,但是当我在 node-postgres 模块上使用它时,我得到了那个错误 请更新您的问题并添加您的节点代码。 【参考方案1】:

我建议distinct on:

select distinct on ( case when receiver = 'user1' then sender else receiver end ) m.*
from messages m
where 'user1' in (receiver, sender)
order by (case when receiver = 'user1' then sender else receiver end), time desc;

【讨论】:

以上是关于Postgresql 错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用的主要内容,如果未能解决你的问题,请参考以下文章

必须出现在 postgresql 的 GROUP BY 子句中

Django 与 Postgresql,列必须出现在 GROUP BY 子句中或在聚合函数中使用

错误:分布式表的唯一索引必须包含散列分布列。啥时候从 postgresql 迁移到 postgresql-xl

PostgreSQL 分组错误

具有分组依据的 PostgreSQL 聚合函数

Postgresql中的Inner Join子查询导致错误