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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:24:03