PostgreSQL行式会话表查询求助:提取客户端发起的已回复会话
解决PostgreSQL会话合并问题
我来帮你搞定这个会话合并的需求!你的原SQL主要问题在于没准确区分用户和客户的消息方向,也没处理同一会话下多条客户消息的拼接,同时没过滤掉无回复或用户发起的会话。
正确的SQL解决方案
WITH client_messages AS ( SELECT client_id, user_id, string_agg(message, ' ' ORDER BY id) AS client_message FROM conversations WHERE incoming = True GROUP BY client_id, user_id ), user_messages AS ( SELECT client_id, user_id, string_agg(message, ' ' ORDER BY id) AS user_message FROM conversations WHERE incoming = False GROUP BY client_id, user_id ) SELECT cm.client_id, cm.client_message, cm.user_id, um.user_message FROM client_messages cm INNER JOIN user_messages um ON cm.client_id = um.client_id AND cm.user_id = um.user_id;
代码解释
- CTE
client_messages: 分组收集每个client_id+user_id组合下所有来自客户的消息(incoming=True),用string_agg按消息id顺序拼接成一个字符串,保证消息的对话逻辑顺序。 - CTE
user_messages: 同理,收集每个组合下来自用户的回复消息(incoming=False),同样按id排序拼接。 - INNER JOIN: 只保留同时存在客户消息和用户回复的会话——自动排除了无回复的会话(比如id5),也排除了用户发起的会话(比如id7、8,这类会话只有用户消息,不会出现在
client_messages中)。
验证结果
执行这个SQL后,会完全匹配你期望的结果:
| client_id | client_message | user_id | user_message |
|---|---|---|---|
| 1 | Hi, anybody there? I need help | 2 | Yes, I am here to help you. |
| 2 | Did you solve it yet? | 5 | yes, it is solved |
内容的提问来源于stack exchange,提问作者Asim
相关产品推荐
相关产品推荐

