如何基于另一查询的最新write_date排序PostgreSQL查询结果?
解决方案:关联查询并按最新聊天日期排序
你可以通过子查询聚合+关联表的方式实现需求,先获取每个sales_sourcing记录对应的最新聊天write_date,再用这个日期对主查询结果排序:
SELECT ss.id AS ss_number FROM sales_sourcing ss LEFT JOIN ( -- 子查询:按chat_id分组,获取每个分组的最新write_date SELECT chat_id, MAX(write_date) AS latest_write_date FROM sales_sourcing_chat GROUP BY chat_id ) chat ON ss.id = chat.chat_id WHERE ss.state NOT IN ('draft','cancel') AND ss.source_type = 'import' -- 按最新聊天日期降序排序,NULLS LAST确保无聊天记录的条目排在末尾 ORDER BY chat.latest_write_date DESC NULLS LAST;
逻辑说明
- 子查询先对
sales_sourcing_chat表按chat_id分组,用MAX(write_date)提取每个聊天组的最新日期; - 将子查询结果与
sales_sourcing通过ss.id = chat.chat_id关联,匹配每个业务记录对应的聊天信息; - 保留主查询的筛选条件,最后按
latest_write_date降序排序,NULLS LAST可选,用于处理没有对应聊天记录的情况。
如果需要更简洁的写法,也可以用窗口函数实现:
SELECT DISTINCT ss.id AS ss_number FROM sales_sourcing ss LEFT JOIN sales_sourcing_chat chat ON ss.id = chat.chat_id WHERE ss.state NOT IN ('draft','cancel') AND ss.source_type = 'import' ORDER BY MAX(chat.write_date) OVER (PARTITION BY ss.id) DESC NULLS LAST;
内容的提问来源于stack exchange,提问作者Nur Faiz
相关产品推荐
相关产品推荐

