Как найти среднюю разницу во времени между строками в таблице? - PullRequest
6 голосов
/ 18 мая 2009

У меня есть база данных mysql, в которой хранятся некоторые временные метки. Давайте предположим, что в таблице есть только идентификатор и временная метка. Метки времени могут быть продублированы.

Я хочу найти среднюю разницу во времени между последовательными строками, которые не являются дубликатами (по времени). Есть ли способ сделать это в SQL?

Ответы [ 3 ]

29 голосов
/ 18 мая 2009

Если ваша таблица t, а столбец отметок времени - ts, и вы хотите получить ответ в секундах:

SELECT TIMESTAMPDIFF(SECOND, MIN(ts), MAX(ts) ) 
       /
       (COUNT(DISTINCT(ts)) -1) 
FROM t

Это будет намного быстрее для больших столов, так как в нем нет n-квадрата JOIN

Это использует симпатичный математический трюк, который помогает с этой проблемой. Игнорируйте проблему дубликатов на данный момент. Средняя разница во времени между последовательными строками - это разница между первой и последней отметками времени, деленная на количество строк -1.

Доказательство: среднее расстояние между последовательными строками - это сумма расстояний между последовательными строками, деленная на количество последовательных рядов. Но сумма разницы между последовательными строками - это просто расстояние между первым и последним строками (при условии, что они отсортированы по отметке времени). А количество последовательных строк равно общему количеству строк -1.

Тогда мы просто устанавливаем временные метки, чтобы они были различны.

2 голосов
/ 18 мая 2009

Идентификационный номер является смежным?

Вы могли бы сделать что-то вроде,

SELECT 
      a.ID
      , b.ID
      , a.Timestamp 
      , b.Timestamp 
      , b.timestamp - a.timestamp as Difference
FROM
     MyTable a
     JOIN MyTable b
          ON a.ID = b.ID + 1 AND a.Timestamp <> b.Timestamp

Это даст вам список временных различий в каждой последовательной паре строк ...

Тогда вы можете обернуть это в группировку AVG ...

1 голос
/ 18 мая 2009

Вот один из способов:

select avg(timestampdiff(MINUTE,prev.datecol,cur.datecol))
from table cur
inner join table prev 
    on cur.id = prev.id + 1 
    and cur.datecol <> prev.datecol

Функция timestampdiff позволяет выбирать дни, месяцы, секунды и т. Д.

Если идентификаторы не являются последовательными, вы можете выбрать предыдущую строку, добавив правило, что между ними нет других строк:

select avg(timestampdiff(MINUTE,prev.datecol,cur.datecol))
from table cur
inner join table prev 
    on prev.datecol < cur.datecol
    and not exists (
        select * 
        from table inbetween 
        where prev.datecol < inbetween.datecol
        and inbetween.datecol < cur.datecol)
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...