在mysql数据库中查找行和时间戳之间的交叉点

Mic*_*ier 6 mysql sql sqlite postgresql timestamp

我有一个表,列出了某些对象的事件.

有两个事件:"运动"和"负载".它们可以开始和结束,并且这些事件在发生时列出时间戳.

现在我要计算以下三个数字:

  • 运动发生的时间总和(小提琴的价值:700)
  • 负载发生时的时间总和(小提琴中的值:630)
  • 移动和载荷发生的时间总和(小提琴中的值:611)

我在这里为这个问题创建了一个sqlfiddle:

http://sqlfiddle.com/#!2/be512

CL.*_*CL. 1

end前两列计算相应事件之间的差异start。(求和是可交换的,因此我们不需要实际匹配相应的事件。)

第三列搜索movement start前一个事件load是其load start事件的事件,以及movement end后一个load事件是其load end事件的事件。

SELECT (SELECT SUM(timestamp)
        FROM Table1
        WHERE event = 'movement end') -
       (SELECT SUM(timestamp)
        FROM Table1
        WHERE event = 'movement start') AS all_movement,

       (SELECT SUM(timestamp)
        FROM Table1
        WHERE event = 'load end') -
       (SELECT SUM(timestamp)
        FROM Table1
        WHERE event = 'load start') AS all_load,

       (SELECT SUM(timestamp)
        FROM Table1 a
        WHERE event = 'movement end' AND
              (SELECT event
               FROM Table1 b
               WHERE timestamp = (SELECT min(timestamp)
                                  FROM Table1 c
                                  WHERE c.timestamp >= a.timestamp
                                    AND c.event LIKE 'load %')
              ) = 'load end') -
       (SELECT SUM(timestamp)
        FROM Table1 a
        WHERE event = 'movement start' AND
              (SELECT event
               FROM Table1 b
               WHERE timestamp = (SELECT max(timestamp)
                                  FROM Table1 c
                                  WHERE c.timestamp <= a.timestamp
                                    AND c.event LIKE 'load %')
              ) = 'load start') AS load_movement;
Run Code Online (Sandbox Code Playgroud)