如何在PostgreSQL中高效计算车辆里程的两类汇总值
PostgreSQL单表扫描实现按车辆统计两类里程总和
直接使用PostgreSQL原生的条件聚合(通过FILTER子句或CASE表达式),仅需一次表扫描即可完成两类里程的统计,完美适配数十万行的大数据场景:
最优实现(PostgreSQL原生)
利用FILTER子句实现更清晰的条件聚合,性能最优:
SELECT vehicle_id, SUM(mileage) AS total_mileage, -- 所有记录的里程总和 SUM(mileage) FILTER (WHERE is_processed = false) AS unprocessed_mileage -- 仅未处理记录的里程总和 FROM mileage GROUP BY vehicle_id;
兼容式写法(可选)
如果需要兼容其他SQL数据库,可使用CASE表达式替代FILTER:
SELECT vehicle_id, SUM(mileage) AS total_mileage, SUM(CASE WHEN is_processed = false THEN mileage ELSE 0 END) AS unprocessed_mileage FROM mileage GROUP BY vehicle_id;
性能优化建议
针对数十万行数据,可创建覆盖复合索引避免回表扫描,进一步提升查询速度:
CREATE INDEX idx_mileage_vehicle_processed ON mileage (vehicle_id, is_processed) INCLUDE (mileage);
该索引包含分组条件和聚合所需的字段,查询时直接从索引读取数据,无需访问主表。
内容的提问来源于stack exchange,提问作者Asen Georgiev
相关产品推荐
相关产品推荐

