【问题标题】:Sampling SQL timeseries采样 SQL 时间序列
【发布时间】:2011-11-12 05:35:06
【问题描述】:

我有一个日期时间的时间序列,存储在 mySQL 中的双列,并希望每分钟对时间序列进行一次采样(即每隔一分钟提取最后一个值)。有没有一种在一个 select 语句中执行此操作的有效方法?

蛮力方式将涉及选择整个系列并在客户端进行采样或为每个点发送一个选择(例如select * from data where timestamp<xxxxxxxxx order by timestamp desc limit 1)。

【问题讨论】:

    标签: sql time-series


    【解决方案1】:

    您可以将时间戳转换为 UNIX 时间戳,按unix_timestamp DIV 60 分组,然后从每个组中提取最大时间戳。然后将获取的列表连接回原始表,以提取获取的时间戳的数据。

    基本上它可能看起来像这样:

    SELECT
      t.*  /* you might want to be more specific here */
    FROM atable t
      INNER JOIN (
        SELECT
          MAX(timestamp) AS timestamp
        FROM atable
        GROUP BY UNIX_TIMESTAMP(timestamp) DIV 60
      ) m ON t.timestamp = m.timestamp
    

    【讨论】:

    • GROUP BY UNIX_TIMESTAMP(timestamp) DIV 60... 太棒了!我想知道,这是否可以利用时间戳上的索引?或者您是否有任何其他优化建议,所以这将适用于非常大的数据集,而不是在单独的表中聚合统计信息?
    • @Domi:谢谢。我非常怀疑这会使用timestamp 上的索引。由于我并不是真正的 MySQL 专家,因此我不确定该建议什么作为一个好的选择。这基本上是一个“每组最大 N”问题,在大型数据集上,我个人可能会尝试一种既定的、尽管非常特定于 MySQL 的方法来解决这种涉及变量的问题,类似于this answer(一些东西,同样,如果我完全诚实的话,我怀疑在回答这个问题时我可能并不知道)。
    【解决方案2】:

    您可以使用DATE_FORMAT 来获取所需的日期时间部分。您希望将日期时间降至分钟,然后对于具有“四舍五入”时间的每个组,获取具有最大时间的行。

    【讨论】:

      猜你喜欢
      • 2012-11-26
      • 2020-12-28
      • 2014-07-24
      • 2017-02-20
      • 2020-05-18
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多