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 函数。
在 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 函数。