SQL根据时间戳差异查询数据

问题描述 投票:3回答:2

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

即我想创建一个查询获取某个测量列的平均值,但仅适用于时间差小于60秒的后续行。

示例表看起来像这样:

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

时间戳之间的差异对于所有行都是可以的,除了3到4之间,它们相差超过60秒。在这种情况下,平均值不会采用ID为4的行,而只采用前3行。

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

mysql sql database influxdb
2个回答
3
投票

使用带有时间戳条件的内部联接将表连接到自身,以包括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

4
投票

我想在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

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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.