【问题标题】:SQL get aggregate value within a time-window in a time-series tableSQL在时间序列表的时间窗口内获取聚合值
【发布时间】:2017-07-27 20:58:33
【问题描述】:

我正在尝试使用 SQLite/sqlalchemy 在 Python 中编写一个 SQL 方法,以基于另一个包含原始时间的表来构建一个新表,其中包含一段时间内分析的数据,如平均值、中值、最大值、var -系列数据。

假设原始数据是并且时间戳不是均匀分布的。我想得到另一个表:来自原始数据表,它基本上是 60 秒滑动时间窗口内的聚合值,例如:

RAW:
TIME      VALUE
11:11:12   12
11:11:22   24
11:11:34   16
11:12:21   18
11:12:45   22
11:13:03   15

我想得到:

ID  WINDOW_TIME      MEAN            MEDIAN         MAX       VAR
1      11:11    mean(12,24,16)   med(12,24,16) ...
2      11:12    mean(18,22)      ...
3      11:13    ...
...

如何根据时间戳对数据进行分组?

【问题讨论】:

  • 只用您正在使用的一个数据库标记问题。

标签: python sql sqlite


【解决方案1】:

如果您的 TIME 列是时间类型 (https://dev.mysql.com/doc/refman/5.7/en/time.html),您可以在您的组中执行类似的操作。

GROUP BY TIME_FORMAT(`TIME`, '%H:%i')

另一方面,如果列只是一个字符串类型,事情就有点棘手了。我想,如果你能保证每个值的格式都是 hh:ii:ss,你可以使用SUBSTRING

GROUP BY SUBSTRING(`TIME` FROM 1 FOR 5)

但是,如果您选择其中任何一个选项,我真的希望,为了您,您的数据库中的记录很少,因为我很确定这些选项中的每一个在以下方面都会很糟糕表现。我还没有进行广泛的测试,但我认为 mysql 不能在这两个示例中使用索引。

老实说,您最好为每条记录创建一个包含时间为 hh:ii 的表,然后将该表用于聚合查询,而不是尝试在所有一个查询中执行此操作。

【讨论】:

  • 谢谢你,伙计!我会尝试将 hh:mm 存储为时间戳,然后性能不佳是有道理的
猜你喜欢
  • 1970-01-01
  • 2017-09-11
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
相关资源
最近更新 更多