Запрос, учитывающий изменения в часе метки времени

#mysql #sql #timestamp

Вопрос:

Проблема заключается в следующем. У меня есть таблица, содержащая следующие столбцы:

машина отметка времени скорость (м/мин)
C1 22/9/2020, 16:45 15
C1 22/9/2020, 16:55 5
C1 22/9/2020, 17:20 19

Что я хочу знать-это расстояние , пройденное в каждый час для каждой машины, поэтому мне нужно вычесть время текущей строки с меткой времени следующем ряду, а затем умножить на скорость в первой строке (е.г: 16:55 — 16:45 = 10 мин -> 10 * 15 = 150 метров между 16:45 и 16:55).

Я смог сделать это, используя логику, аналогичную приведенной ниже (это не один и тот же запрос).:

  ' 1st get the timestamp of the next row'
 lead(query."timestamp") OVER (PARTITION BY query.id ORDER BY query."timestamp") AS lead_timestamp
 ' 2nd get the duration'
 query."lead_timestamp" - query."timestamp" AS duration
 ' 3rd calculate the distance'
 query."duration" * query."speed" AS distance
 ' 4th group by hour'
 GROUP BY date_trunc('hour', CAST(query."timestamp" AS timestamp)
 

Это работает почти на 100% нормально. Я получаю таблицу, аналогичную приведенной ниже:

машина отметка времени продолжительность (метров)
C1 22/9/2020, 16:00 275
C1 22/9/2020, 17:00

Но, как вы можете видеть, когда я группирую данные в час, общее количество счетчиков за час 16:00 неверно, потому что после метки времени, равной «22/9/2020, 16:55», не было отметки времени, равной «22/9/2020, 16:55», что вынудило группировку закончить на «22/9/2020, 16: 59». Итак, в конце концов, я добавил к часу 16:00 часть продолжительности для часа 17:00 (эти 20 минут были добавлены к часу 16:00).

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

Вы не могли бы мне помочь? Спасибо! Если я не был ясен, пожалуйста, запросите дополнительную информацию!

Комментарии:

1. более подробную информацию, пожалуйста. (потому что вам не ясно) Попробуйте добавить «ожидаемый результат». Также попробуйте дать ПОЛНЫЕ инструкции SQL (в той , которую вы создали, отсутствует SELECT , и последняя ) ).

2. Кроме того, MySQL не знает эту функцию date_trunc() ….

Ответ №1:

Это могло бы помочь:

 WITH cte as (
   select 'c1' as  machine, '2020-09-22 16:46' as timestamp, 15 as speed
   union all 
   select 'c1', '2020-09-22 16:56', 5
   union all 
   select 'c1', '2020-09-22 17:20', 19)
select 
   machine,
   timestamp,
   speed,
   lead(timestamp) over (partition by machine) nextTime,
   TIMEDIFF( lead(timestamp) over (partition by machine), timestamp) diffTime,
   minute(TIMEDIFF( lead(timestamp) over (partition by machine), timestamp))*speed meters
from cte;
 

выход:

машина отметка времени Скорость В следующий раз Разное время метры
c1 2020-09-22 16:46 15 2020-09-22 16:56 00:10:00.000000 150
c1 2020-09-22 16:56 5 2020-09-22 17:20 00:24:00.000000 120
c1 2020-09-22 17:20 19