【问题标题】:Get average time difference between current and previous row获取当前行和上一行之间的平均时间差
【发布时间】:2022-01-19 08:55:18
【问题描述】:

我想使用带有 group by 的聚合函数来获得两个不同行之间的平均差异(例如以秒为单位)。

假设我有一张这样的桌子:

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 获取此类信息?

【问题讨论】:

  • 如果您想要的结果是基于您的样本数据,我会更容易理解。

标签: mysql sql datetime group-by aggregate-functions


【解决方案1】:

假设您使用的是 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

【讨论】:

  • 你可以使用DATE()函数而不是转换日期
  • 太棒了!这正是我需要的!谢谢
【解决方案2】:

您可以通过将最新时间戳和最早时间戳之间的差除以计数来估算给定日期所有记录之间的平均距离(以分钟为单位):

SELECT DATE(ts),
       TIMESTAMPDIFF(MINUTE, MIN(ts), MAX(ts)) / (COUNT(data) - 1) AS avg_distance,
       COUNT(data)
FROM yourTable
GROUP BY DATE(ts);

【讨论】:

  • COUNT() 必须递减。 N 个值之间有 N-1 个间隙。当然,对于单独的值,平均差距将为 NULL/未定义。
  • @Akina 在这种情况下只使用AVG 可能是有意义的,这样可以完全避免除以零的问题。
  • 对于 SELECT,除以零返回 NULL。因此没问题。
  • AVG 内的 MIN/MAX 不会飞。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2014-03-05
  • 1970-01-01
相关资源
最近更新 更多