You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Postgres按分组优先取ACTIVE=Y记录否则取最新日期记录的实现方法

方案1:最小修改你现有写法

只需要调整array_agg的排序规则,将ACTIVE='Y'作为最高优先级排序条件即可,完全不需要加EXISTS判断:

SELECT 
  agreement_group_id, 
  (array_agg(id ORDER BY active = 'Y' DESC, status_action_date DESC))[1] AS val
FROM ets.agreement_t 
GROUP BY agreement_group_id 
ORDER BY agreement_group_id;

原理是PostgreSQL中布尔值true排序优先级高于false,同一分组内如果存在ACTIVE='Y'的记录会被排在最前面,没有的话就会按STATUS_ACTION_DATE倒序取最新的记录,完全匹配你的需求。


方案2:性能更优的DISTINCT ON写法

如果你的表数据量较大更推荐这个方案,DISTINCT ON是PostgreSQL特有的语法,可以直接取分组排序后的第一条记录,不需要聚合生成完整数组,性能更好:

SELECT DISTINCT ON (agreement_group_id)
  agreement_group_id,
  id AS val
FROM ets.agreement_t
ORDER BY 
  agreement_group_id,
  active = 'Y' DESC,
  status_action_date DESC;

如果提前建联合索引(agreement_group_id, (active = 'Y') DESC, status_action_date DESC, id),这个查询可以直接走索引扫描,不需要额外排序和聚合,效率非常高。

两种写法返回的结果都和你给出的预期输出完全一致。

内容的提问来源于stack exchange,提问作者gene b.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:57:04