【问题标题】:How to calculate average time Postgresql如何计算Postgresql的平均时间
【发布时间】:2018-04-17 14:18:38
【问题描述】:

我正在尝试执行一个查询,让我知道我的表格的结构如下所示

RunnerID,   State,   Timestamp_race
R1          start     2017-04-11 12:15:15.722415
R2          start     2017-04-11 13:15:15.722415
R1          finish    2017-04-11 15:15:15.722415
R1          finish    2017-04-11 17:15:15.722415

跑步者在不同的时间开始和在不同的时间结束我们的想法是计算整场比赛的平均时间

【问题讨论】:

  • 请向我们展示您已经尝试过的方法,以便我们为您指引正确的方向。
  • 看起来 R1 完成了两次,而 R2 从未完成。

标签: sql postgresql average


【解决方案1】:

您可以使用extract(epoch) 获取每场比赛的秒数,然后取平均值:

select avg(seconds) as avg_seconds
from (select runnerid, extract(epoch from max(Timestamp_race) - min(Timestamp_race)) as seconds
      from t
      group by runnerid
     ) r;

这假设最短时间是开始,最长是结束。

编辑:

如果你想将平均值作为一个区间,你可以这样做:

select avg(diff) as avg_diff
from (select runnerid, (max(Timestamp_race) - min(Timestamp_race)) as diff
      from t
      group by runnerid
     ) r;

【讨论】:

  • 不需要从时间戳的差异中提取纪元。 PostgreSQL 在减去时间戳时自然会返回一个区间数据类型。默认格式有点冗长,但 TO_CHAR 函数带有适当的掩码,例如'DD HH24:MI:SS.MS' 将对此有所帮助。
  • @Sentinel 。 . .我认为秒是一种不错的格式,但你说得很好。
【解决方案2】:

这是一个更好的格式:

select to_char(avg(seconds),'DD HH24:MI:SS.MS') as avg_time
from (select runnerid, max(Timestamp_race) - min(Timestamp_race) as seconds
      from race t
      group by runnerid
     ) r;

|        avg_time |
|-----------------|
| 00 03:30:00.000 |

【讨论】:

    猜你喜欢
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多