Нахождение наибольшего временного интервала между списком дат - PullRequest
0 голосов
/ 09 марта 2010

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


ОБНОВЛЕНИЕ: Дайте мне посмотреть, смогу ли я сделать это немного менее запутанным. Я хочу сравнить временную метку каждого элемента с элементом до и после него, чтобы узнать, сколько времени прошло между этими двумя моментами. Я хочу сделать это для всех предметов, и в итоге получим наибольшую разницу между двумя предметами.

Мне не нужна самая большая разница между любыми двумя предметами, потому что это, очевидно, будет первый и последний пункт. Надеюсь, это описание будет понятнее.


ОБНОВЛЕНИЕ 2: Так быстро после принятия ответа я понял, что снова неправильно описал проблему. Новая проблема заключается в том, что идентификаторы предметов не в том же порядке, что и отметка времени.

Я попытаюсь описать проблему с некоторыми данными ...

Item - Time (seconds)
Item0 - 000
Item1 - 030
Item2 - 120
Item3 - 090
Item4 - 100

Так что для пунктов выше я хочу 60 секунд (между пунктами 1 и 3), но ответ Мартина (отличный) вернет 90 секунд (пункты 1 и 2)

Ответы [ 3 ]

3 голосов
/ 09 марта 2010

Предполагая, что таблица как:

create table item ( i int not null primary key, 
                    t datetime not null );

select i1.i, i2.i, 
       abs( unix_timestamp( i1.t ) - unix_timestamp( i2.t )) diff 
from item i1
join item i2 on i1.i+1 = i2.i 
order by diff desc
limit 1;

Это самостоятельное соединение, в котором строка соединяется со следующей строкой. Значение diff выводится в порядке убывания (сначала по возрастанию), и выводится только первая строка.

РЕДАКТИРОВАТЬ: Вот слабая попытка спасти мое решение с учетом уточнения вопроса.

Создайте временную таблицу с порядком записей datetime, присвойте значение auto_increment, представляющее ранжирование, затем примените самосоединение к временной таблице:

create temporary table ranked_item ( rank int not null auto_increment primary key, 
                    i int not null, 
                    t datetime not null );

insert into ranked_item 
       select null, i, t from item order by t asc;

select i1.rank, i2.rank, i1.i, i2.i, 
       abs( unix_timestamp( i1.t ) - unix_timestamp( i2.t )) diff 
from ranked_item i1
join ranked_item i2 on i1.rank+1 = i2.rank 
order by diff desc
limit 1;

Очевидно, что если ваша таблица предметов огромна, это может быть немного экстравагантно.

2 голосов
/ 09 марта 2010

Будет ли это работать?

select max(timestamp_field)-min(timestamp_field) from my_table;
0 голосов
/ 10 марта 2010

Поскольку вы не указали ни одного имени таблицы в вопросе, я составил times_logged_in.log_in, чтобы найти решение. Кроме того, у меня не установлен MySQL, поэтому я попробовал это сделать в MS SQL Server, но это должно быть довольно близко.

select top 1
    tli2.log_in as log_in,
    tli2.previous as previous,
    tli2.log_in - tli2.previous as time_span
from
    (
        select
            tli.log_in as log_in,
                (select max(log_in) from times_logged_in p where p.log_in < tli.log_in) as previous
        from
            times_logged_in tli
    ) tli2
order by time_span desc

Просто чтобы уточнить, это делается следующим образом:

Сначала мы выбираем все время (и любые другие столбцы, которые нам нужны в выводе, например, идентификаторы или что-то еще). Это второй SELECT выше.

Затем мы добавляем столбец в предыдущий раз. Это найдено с помощью коррелированного подзапроса. Это третий SELECT выше.

Затем мы рассчитываем временные интервалы между временем и предыдущим временем, возвращаемым по нашему запросу. Мы делаем это, оборачивая все это в другой запрос. Это первый ВЫБОР выше. Так что теперь у нас есть любые столбцы, которые мы хотим, плюс предыдущее время и промежуток времени между ними. Поэтому мы просто упорядочиваем строки по убыванию по длине временного интервала и берем первую, и все готово!

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