2010-03-09 2 views
0

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


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

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

UPDATE2: Так быстро после принятия ответа я понял, что я снова неправильно описал проблему. Новая проблема заключается в том, что идентификаторы элементов находятся не в том же порядке, что и временная метка.

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

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

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

+2

Я думаю, вам нужно уточнить свой вопрос. Если я прочитаю его так, как вам кажется, вам нужно найти разницу двух дат - это просто вычитание. Возможно, вы хотите найти дату MAX и MIN в наборе дат? – jcollum

ответ

2

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

select max(timestamp_field)-min(timestamp_field) from my_table; 
+0

Я обновил свой вопрос, чтобы быть немного яснее. Это не то, что я искал, но спасибо. – UmYeah

3

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

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 печатается в нисходящем значении (наибольшее первое), и выводится только первая строка.

EDIT: Вот небольшая попытка спасти мое решение, учитывая выяснение вопроса.

Создать временную таблицу с записями даты и время заказа, присвоенные значение 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; 

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

0

Поскольку вы не указали имена таблиц в вопросе, я составил 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 

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

Сначала мы выбираем все времена (и любые другие столбцы, которые мы хотим в выходных данных, как идентификаторы или любой другой). Это второй ВЫБОР выше.

Затем мы добавляем столбец в предыдущее время. Это можно найти, используя коррелированный подзапрос. Это третий ВЫБОР выше.

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

Смежные вопросы