sql数据查询

bqf10yzr  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(669)

我有一个与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行。
我主要计划为XDB数据库编写这个查询,但通常也可以为结构化sql编写一个查询。

vcudknz3

vcudknz31#

我想在我觉得很好的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

有时,一个简单的“查询重述”会带来很大的性能差异。

1rhkuytd

1rhkuytd2#

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

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

相关问题