PostgreSQL按分类分组查询带条件的最大日期实现方法
最优解决方案:条件聚合(仅需1次表扫描,性能远优于多子查询关联)
你不需要使用窗口函数,用更简单的条件聚合就能实现需求,只需要遍历一次表即可完成所有计算,没有多余的关联开销:
SELECT surname, MAX(CASE WHEN blue_eyes THEN date_of_birth END) AS blue_eyes, MAX(CASE WHEN blonde_hair THEN date_of_birth END) AS blonde_hair, MAX(CASE WHEN right_handed THEN date_of_birth END) AS right_handed FROM t_info GROUP BY surname;
方案说明:
- 逻辑完全匹配需求:
CASE语句仅当对应布尔字段为真时返回日期,否则返回NULL,MAX聚合时会自动忽略NULL值,没有符合条件的记录就会返回NULL,和你预期的输出结果完全一致 - 性能优势明显:相比多次子查询关联的方案,条件聚合仅需1次全表扫描,数据量越大性能提升越显著
- 扩展性好:后续如果新增其他布尔条件字段,只需要在SELECT部分新增对应
MAX(CASE...)列即可
可选性能优化
如果表数据量很大,可以创建覆盖索引进一步提速,查询可以直接走索引-only扫描,不需要回表读数据:
CREATE INDEX idx_t_info_cover ON t_info (surname, blue_eyes, blonde_hair, right_handed, date_of_birth);
内容的提问来源于stack exchange,提问作者Tim Edwards
相关产品推荐
相关产品推荐

