Если у вас последняя версия SQLite, она будет поддерживать оконные функции . Если у вас нет последней версии, вы можете обновить ее довольно легко. Я настоятельно рекомендую использовать это.
Оконные функции предоставляют в SQL способ эффективно упорядочивать набор данных, а затем сравнивать соседей, запускать вкладки и т. Д. Синтаксис немного громоздкий, и их решение обычно приводит к вложенным запросам. Требуется немного привыкнуть.
Для начала напишем запрос, который даст нам Video
с указанием даты и времени предыдущего видео (предупреждение, все запросы не проверены и могут быть повреждены)
SELECT datetime
, coordinates
, lag(datetime) OVER (ORDER BY strftime('%s',datetime)) as last_datetime
FROM Video
(Обратите внимание, что кадр по умолчанию неограничен перед текущей строкой, что означает, что у нас есть доступ к предыдущим видео, но не к будущим. Я буду использовать этот факт снова, но не буду это замечать.)
Теперь давайте сделаем такой же запрос, за исключением того, что мы знаем, какие записи начинают сеанс, и я определю его, поскольку в течение предыдущего часа не было ни одной записи.
SELECT datetime
, coordinates
, CASE
WHEN strftime('%s',datetime) - strftime('%s',last_datetime) < 3600
THEN 0
ELSE 1
END as is_session_start
FROM (
SELECT datetime
, coordinates
, lag(datetime) OVER (ORDER BY strftime('%s',datetime)) as last_datetime
FROM Video
) AS video_and_prev_datetime
А теперь мы помечаем каждое видео датой и временем начала его сеанса.
SELECT datetime
, coordinates
, MAX (
CASE
WHEN is_session_start = 1
THEN strftime('%s',datetime)
ELSE 0
END
) OVER (
ORDER BY strftime('%s',datetime)
) AS session_start
FROM (
SELECT datetime
, coordinates
, CASE
WHEN strftime('%s',datetime) - strftime('%s',last_datetime) < 3600
THEN 0
ELSE 1
END as is_session_start
FROM (
SELECT datetime
, coordinates
, lag(datetime) OVER (ORDER BY strftime('%s',datetime)) as last_datetime
FROM Video
) AS video_and_prev_datetime
) as video_and_session_start
А теперь у вас есть видео, классифицированные по времени начала сеанса.
Если вы предпочитаете делать это в коде, я рекомендую просто отсортировать Video
по strftime('%s',datetime)
и затем выполнить то же самое «сравнить с последними, отследить начало сеансов и добавить их» в коде. Но с учетом того, что оконные функции с течением времени поступают во все большее и большее количество баз данных, вы также можете узнать, как их использовать, как я только что продемонстрировал.