获取当前行和上一行之间的平均时间差
Get average time difference between current and previous row
我想使用带分组依据的聚合函数获得两个不同行之间的平均差异(例如以秒为单位)。
假设我有一个像这样的 table:
id | ts | data
1123 | 2022-01-19 07:15:23 | ...
1124 | 2022-01-19 07:17:28 | ...
1125 | 2022-01-19 07:21:19 | ...
1126 | 2022-01-19 07:21:23 | ...
.
.
.
1227 | 2022-01-19 09:01:04 | ...
起初我想把它分组,并想计算我们每天有多少行。这很简单:
SELECT DATE(ts), COUNT(data)
FROM table
GROUP BY DATE(ts)
结果如下所示:
DATE(ts) | COUNT(data)
2022-01-18 | 519
2022-01-19 | 104
但除此之外,我还想知道前一行之间的平均距离(以秒为单位),以便了解插入新数据的频率。所以结果应该是这样的:
DATE(ts) | Average Difference | COUNT(data)
2022-01-18 | 12 | 519
2022-01-19 | 14 | 104
有没有办法使用 SQL 获取此类信息?
您可以通过取最新时间戳和最早时间戳之间的差值除以计数来估算给定日期所有记录之间的平均距离(以分钟为单位):
SELECT DATE(ts),
TIMESTAMPDIFF(MINUTE, MIN(ts), MAX(ts)) / (COUNT(data) - 1) AS avg_distance,
COUNT(data)
FROM yourTable
GROUP BY DATE(ts);
假设您使用的是 MySQL 8 或更高版本,您可以使用 lag
函数查找之前的日期时间以计算差异。休息很简单:
with cte as (
select cast(ts as date) as dt
, ts
, lag(ts) over(partition by cast(ts as date) order by ts) as prev_ts
from t
)
select dt
, count(*) as count
, avg(timestampdiff(second, prev_ts, ts)) as avg_diff
from cte
group by dt
我想使用带分组依据的聚合函数获得两个不同行之间的平均差异(例如以秒为单位)。
假设我有一个像这样的 table:
id | ts | data
1123 | 2022-01-19 07:15:23 | ...
1124 | 2022-01-19 07:17:28 | ...
1125 | 2022-01-19 07:21:19 | ...
1126 | 2022-01-19 07:21:23 | ...
.
.
.
1227 | 2022-01-19 09:01:04 | ...
起初我想把它分组,并想计算我们每天有多少行。这很简单:
SELECT DATE(ts), COUNT(data)
FROM table
GROUP BY DATE(ts)
结果如下所示:
DATE(ts) | COUNT(data)
2022-01-18 | 519
2022-01-19 | 104
但除此之外,我还想知道前一行之间的平均距离(以秒为单位),以便了解插入新数据的频率。所以结果应该是这样的:
DATE(ts) | Average Difference | COUNT(data)
2022-01-18 | 12 | 519
2022-01-19 | 14 | 104
有没有办法使用 SQL 获取此类信息?
您可以通过取最新时间戳和最早时间戳之间的差值除以计数来估算给定日期所有记录之间的平均距离(以分钟为单位):
SELECT DATE(ts),
TIMESTAMPDIFF(MINUTE, MIN(ts), MAX(ts)) / (COUNT(data) - 1) AS avg_distance,
COUNT(data)
FROM yourTable
GROUP BY DATE(ts);
假设您使用的是 MySQL 8 或更高版本,您可以使用 lag
函数查找之前的日期时间以计算差异。休息很简单:
with cte as (
select cast(ts as date) as dt
, ts
, lag(ts) over(partition by cast(ts as date) order by ts) as prev_ts
from t
)
select dt
, count(*) as count
, avg(timestampdiff(second, prev_ts, ts)) as avg_diff
from cte
group by dt