这是我的看法:
SELECt record_id, string_agg(text, ' ' ORDER BY id) AS contextFROM ( SELECt *, coalesce(sum(incl::integer) OVER (ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING),0) AS grp FROM ( SELECt *, is_response AND text IN (SELECT text FROM responses) as incl FROM conversations ) c ) c1GROUP BY record_id, grpHAVINg bool_or(incl)ORDER BY max(id);
这将扫描表
conversations一次,但是我不确定它的性能是否会比您的解决方案更好。基本思想是使用窗口函数来计算同一记录中的前几行如何结束对话。然后,我们可以使用该数字进行分组,
record_id并丢弃不完整的对话。



