SQL根据时间戳差异查询数据
SQL querying data based on the timestamp difference
我有一个与 sql 数据库相关的问题。
即我想创建一个查询来获取某个测量列的平均值,但仅限于那些时差小于 60 秒的后续行。
一个例子 table 看起来像这样:
| 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 编写查询。
使用带时间戳条件的内部联接将 table 联接到自身,以包含 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
我想在 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
有时,一个简单的 "query rephrase" 可以产生很大的性能差异。
我有一个与 sql 数据库相关的问题。
即我想创建一个查询来获取某个测量列的平均值,但仅限于那些时差小于 60 秒的后续行。
一个例子 table 看起来像这样:
| 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 编写查询。
使用带时间戳条件的内部联接将 table 联接到自身,以包含 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
我想在 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
有时,一个简单的 "query rephrase" 可以产生很大的性能差异。