SQL-запрос: список всех идентификаторов, которые были активны в течение заданного интервала времени, отсортированные по времени их начала.

У меня есть таблица MySQL, содержащая точки (координаты x/y) дорожек. Каждая строка содержит идентификатор дорожки, отметку времени и позиции X и Y для этой дорожки в данный момент времени.

Мне нужен список всех TrackID, которые были активны в течение заданного интервала времени (tmin...tmax), отсортированные по времени их начала, даже если это время начала находится за пределами интервала.

Небольшая иллюстрация может помочь:

Illustration

В качестве примера: Дорожка 1 активна с t11 до t12, что означает, что в моей таблице много строк с ID=1 и временными метками в диапазоне от t11 до t12.

Желаемый результат будет таким:

TrackID | StartTime
--------+-----------
    7   |    t71
    1   |    t11
    2   |    t21
    6   |    t61

Я пробовал что-то вроде этого:

SELECT TrackID, MIN(Timestamp) AS StartTime FROM Tracks WHERE Timestamp BETWEEN tmin AND tmax GROUP BY TrackID ORDER BY StartTime;

Однако в приведенном выше примере я не получаю реальное время начала для дорожек 1 и 7, так как все строки с метками времени меньше tmin вообще не рассматриваются.

Конечно, я мог бы на первом этапе просто получить все активные TrackID с помощью

SELECT TrackID FROM Tracks WHERE Timestamp BETWEEN tmin AND tmax GROUP BY TrackID;

, а затем с помощью отдельных запросов найти время начала всех этих треков, а затем отсортировать их в коде моего приложения.

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

8
задан Cœur 15 August 2017 в 05:37
поделиться