Как выбрать разницу во времени между строками и фильтром - PullRequest
0 голосов
/ 09 января 2019

Я использую MySQL 5.7, чтобы вычислить разницу во времени в секундах между последовательными строками. У меня есть несколько вопросов

  1. Как выбрать предыдущую строку для использования при расчете каждой результирующей строки? В частности, какая часть запроса фактически делает это?
  2. Как я могу отфильтровать столбец @diff, чтобы исключить 0 или значения, превышающие, скажем, 60 секунд? Каждый раз, когда я пытаюсь добавить предложение WHERE, я получаю сообщение об ошибке.
  3. После того, как я отфильтрую, смогу ли я SUM столбец @diff получить общее время?

Запрос

SELECT @diff   AS start,
       created AS end,
       IF(@diff = 0, 0, UNIX_TIMESTAMP(`created`) - UNIX_TIMESTAMP(@diff)) AS diff,
       @diff := created AS endtime
FROM   events,
       (SELECT @diff := 0) AS x
ORDER  BY events.created

Исходная таблица events

Desc      | Timestamp
-------------------------------
Event 1   | 2019-01-03 17:21:03
Event 2   | 2019-01-03 17:21:03
Event 3   | 2019-01-03 17:21:03
Event 4   | 2019-01-03 17:21:14
Event 5   | 2019-01-03 17:21:16
Event 6   | 2019-01-03 17:25:46

Текущий результат

start               | end                   | diff      | endtime
-------------------------------------------------------------------------
0                   | 2019-01-03 17:21:03   | 0         | 2019-01-03 17:21:03
2019-01-03 17:21:03 | 2019-01-03 17:21:03   | 0.000000  | 2019-01-03 17:21:03
2019-01-03 17:21:03 | 2019-01-03 17:21:03   | 0.000000  | 2019-01-03 17:21:03
2019-01-03 17:21:03 | 2019-01-03 17:21:14   | 11.00000  | 2019-01-03 17:21:14
2019-01-03 17:21:14 | 2019-01-03 17:21:16   | 2.000000  | 2019-01-03 17:21:16
2019-01-03 17:21:16 | 2019-01-03 17:25:46   | 270.0000  | 2019-01-03 17:25:46

Желаемый результат

start               | end                   | diff      | endtime
-------------------------------------------------------------------------
2019-01-03 17:21:03 | 2019-01-03 17:21:14   | 11.00000  | 2019-01-03 17:21:14
2019-01-03 17:21:14 | 2019-01-03 17:21:16   | 2.000000  | 2019-01-03 17:21:16

1 Ответ

0 голосов
/ 09 января 2019

В MySQL 8+ вы должны использовать оконные функции:

SELECT lag(created) over (order by created)   AS start,
       created AS end,
       coalesce(UNIX_TIMESTAMP(created) - UNIX_TIMESTAMP(lag(created) over (order by created)), 0) as diff
FROM events e
ORDER BY e.created;

В более ранних версиях ваш код плохо написан, потому что MySQL не гарантирует порядок вычисления выражений в SELECT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...