【问题标题】:SQL querying data based on the timestamp differenceSQL根据时间戳差异查询数据
【发布时间】:2018-08-31 13:38:43
【问题描述】:

我有一个与 sql 数据库有关的问题。

即我想创建一个查询来获取某个测量列的平均值,但只针对那些时间差小于60秒的后续行。

示例表如下所示:

| ID | Measurement | Timestamp | 
| 1  | 0.564       | 1535648400|
| 2  | 0.456       | 1535648459|
| 3  | 0.785       | 1535648501|
| 4  | 0.321       | 1535648620|

时间戳之间的差异对于所有行都是可以的,但在 3 和 4 之间,它们的差异超过 60 秒。在这种情况下,average 不会取 ID 为 4 的行,而只会取前 3 行。

我主要计划为 InfluxDB 数据库编写此查询,但通常也可以为结构化 SQL 编写查询。

【问题讨论】:

  • 如果没有想要的结果,您的问题有点难以理解。另外,您使用的是哪个数据库? InfluxDB 与 MySQL 非常不同。
  • @GordonLinoff 实际的表测量和查询要长一些,但我不想造成额外的混乱。对我来说,重要的是看看对于任何类似的例子,这样的查询在 InfluxDB 中的主要表现如何,或者如果没有,至少在 MySQL 之类的东西中,因为虽然数据库不同,但查询语言并没有那么多。

标签: mysql sql database influxdb


【解决方案1】:

我想在 V.G. 的基础上添加一个额外的答案,我发现它非常好。出于性能原因,您可能需要改写查询并添加一个好的索引,如下所示:

create index ix1 on table (timestamp);

那么查询可能是:

SELECT t1.ID, t1.measurement, t1.timestamp,  avg(t2.measurement) 
FROM table t1, table t2
WHERE t2.timestamp >= t1.timestamp
  AND t2.timestamp < t1.timestamp + 60*1000
GROUP BY t1.ID, t1.measurement, t1.timestamp

有时,一个简单的“查询改写”可以产生很大的性能差异。

【讨论】:

    【解决方案2】:

    使用带时间戳条件的内连接将表连接到自身,以包含 60 秒内的所有记录。下面的标准 SQL(需要针对 InfluxDB 进行调整):

    SELECT t1.ID, t1.measurement, t1.timestamp,  avg(t2.measurement) 
    FROM table t1, table t2
    WHERE t1.timestamp <= t2.timestamp
      AND t1.timestamp + 60*1000 > t2.timestamp
    GROUP BY t1.ID, t1.measurement, t1.timestamp
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 2011-09-17
      • 2014-04-17
      相关资源
      最近更新 更多