【问题标题】:SQL - Find average interval between rows in the timestamp columnSQL - 查找时间戳列中行之间的平均间隔
【发布时间】:2021-04-19 04:43:29
【问题描述】:

在 PostgreSQL 和 MySQL 表中,我有一个时间戳列,指示数据导入时间戳。它基于一些预定的时间间隔。我需要找到负载的平均(或近似)时间间隔。

2021-04-18 06:10:26 | Loaded
2021-04-19 00:10:32 | Loaded
2021-04-19 01:10:26 | Loaded
2021-04-19 02:40:24 | Loaded
2021-04-19 04:10:20 | Loaded
2021-04-18 11:10:24 | Loaded
2021-04-18 20:40:28 | Loaded
2021-04-18 00:10:25 | Loaded
2021-04-18 01:10:22 | Loaded
2021-04-18 01:40:22 | Loaded
2021-04-18 13:40:24 | Loaded
2021-04-18 14:10:21 | Loaded

在这里,大约每 30 分钟加载一次数据。

我想编写 SQL 来得到这个。 (在 PostgreSQL 和 MySQL 中)

我试过了,

select avg(starttime) 但它的显示,

Invalid operation: function avg(timestamp without time zone) does not exist;

【问题讨论】:

  • 您应该提供有关您迄今为止所做尝试的详细信息。 StackOverflow 的目的不是让某人为您完成工作 - 它是在您遇到错误或您正在努力克服的问题时为您提供帮助(尚未做任何事情并不是您正在努力克服的问题的示例) )
  • 我试过平均,但没有用

标签: mysql sql postgresql average


【解决方案1】:

对于 MySQL8.0 和 PostgreSQL:

with cte as
(
   select timestamp_column- lead(timestamp_column) over (order by timestamp_column) time_diff
   from tablename
) 
select avg(time_diff) from cte

对于旧版本的 MySQL

select avg(time_diff) from
       (
       select timestamp_column- (select min(timestamp_column)from tablename tn
       where  tn.timestamp_column>t.timestamp_column) time_diff
       from tablename t
       )t

【讨论】:

    【解决方案2】:

    您无法计算时间戳的平均值 - 毕竟“周一下午、周二上午和周四 5 点”的平均值是多少?

    您需要平均时间戳之间的差异。在 Postgres 中,从另一个时间戳中减去一个时间戳会产生一个 interval,然后您可以应用 avg() 聚合。要获得差异,您可以使用窗口函数:

    以下是 Postgres 的。

    select avg(diff)
    from (
       select starttime - lag(starttime) over (order by starttime) as diff
       from the_table
    ) t
    

    对于MySQL,需要找到等价的算子来计算两个时间戳的差值。

    【讨论】:

      【解决方案3】:

      最简单的方法是:

      select (max(starttime) - min(starttime)) / nullif(count(*) - 1, 0)
      from t;
      

      此计算不需要子查询或窗口函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多