SQL - 查找时间戳列中行之间的平均间隔

SQL - Find average interval between rows in the timestamp column

在 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;

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

您需要对时间戳之间的差异进行平均。在 Postgres 中,从另一个时间戳中减去一个时间戳会产生一个 interval 并且您可以在其上应用 avg() 聚合。要获得差异,您可以使用 window 函数:

以下内容适用于 Postgres。

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

对于MySQL,您需要找到等效运算符来计算两个时间戳之间的差异。

对于 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

最简单的方法是:

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

此计算既不需要子查询也不需要 window 函数。