PostgreSQL:计算两表日期间隔并按event_id求平均时长的方法
实现方案
你可以直接对日期差值使用PostgreSQL内置的AVG()聚合函数统计平均值,同时建议你把原有SQL的隐式交叉连接改为显式JOIN并补充两表关联条件,避免生成不必要的笛卡尔积导致结果错误、查询性能低下。
方案1:直接统计所有关联记录的平均间隔
适用于不需要对日期组合去重的场景:
SELECT ets.event_id, -- 如果需要取整可改为 ROUND(AVG(dtn.don_date - ets.event_date)) AS avg_date_diff AVG(dtn.don_date - ets.event_date) AS avg_date_diff FROM events ets INNER JOIN donation dtn ON ets.event_id = dtn.event_id -- 此处请替换为你业务中两表的实际关联条件 GROUP BY ets.event_id ORDER BY ets.event_id;
两表日期相减默认返回相差的天数,AVG()计算后返回的是numeric类型的平均天数,可根据需求用ROUND()、::int等做格式转换。
方案2:先对日期组合去重再统计平均
如果你需要沿用原有SQL先按event_id、event_date、don_date去重的逻辑,可以用CTE先处理去重再聚合:
WITH distinct_date_diff AS ( SELECT ets.event_id, dtn.don_date - ets.event_date AS date_diff FROM events ets INNER JOIN donation dtn ON ets.event_id = dtn.event_id -- 替换为实际关联条件 GROUP BY ets.event_id, ets.event_date, dtn.don_date ) SELECT event_id, AVG(date_diff) AS avg_date_diff FROM distinct_date_diff GROUP BY event_id ORDER BY event_id;
内容的提问来源于stack exchange,提问作者dracoDevs
相关产品推荐
相关产品推荐

