Выбрать все данные с разной секундой между двумя датами

У меня есть таблица mysql с данными, связанными с датой и временем. В каждой строке есть данные и дата, например:

datetime               name
2009-06-25 10:00:00    jhon
2009-06-25 10:00:05    jack
2009-06-25 10:00:11    json
2009-06-25 10:00:15    jack

Моя проблема в том, что мне нужно, чтобы строки различались вторыми date1 и date2 следующим образом:

datetime               name     second
2009-06-25 10:00:00    jhon     0
2009-06-25 10:00:05    jack     5
2009-06-25 10:00:11    json     6
2009-06-25 10:00:15    jack     4

Спасибо


person dedetargz    schedule 09.01.2017    source источник
comment
Хорошо, я удалю комментарий   -  person Rehban Khatri    schedule 09.01.2017
comment
используйте самостоятельное присоединение, чтобы получить это   -  person Ankit Agrawal    schedule 09.01.2017


Ответы (3)


Вам нужна функция LAG, которая доступна как аналитическая функция во многих базах данных, но не в MySQL. Однако вы можете смоделировать эту функцию, используя переменные сеанса.

SET @dt = (SELECT MIN(UNIX_TIMESTAMP(datetime)) FROM yourTable);

SELECT t.datetime,
       t.name,
       t.curr_dt - t.lag_dt AS second
FROM
(
    SELECT @dt:=UNIX_TIMESTAMP(datetime) curr_dt,
           @dt lag_dt,
           datetime,
           name
    FROM yourTable
    ORDER BY datetime, name
) t
person Tim Biegeleisen    schedule 09.01.2017
comment
Это довольно быстрый подход - person sumit; 09.01.2017
comment
@tim ..its показывает разницу секунд до нуля во всех строках .. не в соответствии с ожиданиями пользователя .. sqlfiddle.com/#!9/a295e8/3 - person Ankit Agrawal; 09.01.2017
comment
Переменные сеанса @AnkitAgrawal не работают в Fiddle. Вам нужно будет протестировать его в реальном Workbench. - person Tim Biegeleisen; 09.01.2017
comment
@TimBiegeleisen я сделал то же самое на моем локальном ... но все тот же результат - person Ankit Agrawal; 09.01.2017

Вы можете найти ближайшую дату и найти разницу, как показано ниже

select 
    datetime,
    name,
    TIME_TO_SEC(TIMEDIFF(datetime, prev_date)) diff
    FROM
    (
        SELECT 
        datetime,
        name,
        (select datetime from tbl t1 where t1.datetime<tbl.datetime order by  datetime desc limit 1) as prev_date
        FROM 
        `tbl`
      )tmp
person sumit    schedule 09.01.2017
comment
Это хорошая альтернатива ответу, который я дал, и он должен подходить для наборов данных разумного размера. - person Tim Biegeleisen; 09.01.2017

Результат:

[SQL] SET @dt = (ВЫБЕРИТЕ МИН. UNIX_TIMESTAMP (datetime) FROM gps_trs_location); [Err] 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '(datetime) FROM gps_trs_location)' в строке 1

person dedetargz    schedule 09.01.2017
comment
Извините, опечатка, используйте это: SET @dt = (SELECT MIN(UNIX_TIMESTAMP(datetime)) FROM yourTable); - person Tim Biegeleisen; 09.01.2017