代码之家  ›  专栏  ›  技术社区  ›  Fikret Basic

基于时间戳差异的SQL查询数据

  •  3
  • Fikret Basic  · 技术社区  · 6 年前

    我有一个与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编写一个查询。

    2 回复  |  直到 6 年前
        1
  •  3
  •   vvg    6 年前

    使用带有时间戳条件的内部连接将表连接到自身,以包含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
    
        2
  •  4
  •   The Impaler    6 年前

    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
    

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