SQL查询:在给定时间间隔内处于活动状态的所有ID的列表,按其开始时间排序

时间:2012-06-01 13:44:46

标签: mysql sql

我有一个MySQL表,其中包含轨道的点(x / y坐标)。每行包含TrackID,时间戳以及该给定时间点该轨道的X和Y位置。

我想要的是在给定时间间隔(tmin ... tmax)内活动的所有TrackID的列表,按其开始时间排序,即使该开始时间超出间隔

一个小插图可能会有所帮助:

Illustration

例如:Track 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查询来完成此操作。我的表包含数百万行,因此效率是一个问题。

4 个答案:

答案 0 :(得分:4)

看一下你的照片 - 你想要的所有范围的结束时间都大于min,开始时间小于max

答案 1 :(得分:3)

考虑它的一种方法是构建逻辑来处理图中的四种特殊情况。这两条规则应该足够了。

  1. 倾向> tmin AND
  2. tstart<的t max
  3. 如果这两个条件中的任何一个为真,则应包括该轨道。您将需要第二个查询中的曲目列表及其最小值和最大值,然后执行比较:

    SELECT T.TrackID
      FROM (SELECT TrackID, MIN(Timestamp) AS StartTime, MAX(Timestamp) AS EndTime
            FROM Tracks GROUP BY TrackID) T
     WHERE T.EndTime > tmin AND T.StartTime < tmax
    

答案 2 :(得分:2)

怎么样:

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

我认为这更好:

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

好的,我确定现在就是这样:p

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

答案 3 :(得分:-1)

您使用第二个查询进入了正确的轨道,只需要添加ORDER BY子句。

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