我有一个MySQL表,其中包含轨道的点(x / y坐标)。每行包含TrackID,时间戳以及该给定时间点该轨道的X和Y位置。
我想要的是在给定时间间隔(tmin ... tmax)内活动的所有TrackID的列表,按其开始时间排序,即使该开始时间超出间隔
一个小插图可能会有所帮助:
例如: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的所有行。
当然,我可以在第一步中使用
获取所有活动的TrackIDSELECT TrackID FROM Tracks WHERE Timestamp BETWEEN tmin AND tmax GROUP BY TrackID;
然后使用单独的查询查找所有这些轨道的开始时间,然后在我的应用程序代码中对它们进行排序。
但我确信有一种方法可以通过一个SQL查询来完成此操作。我的表包含数百万行,因此效率是一个问题。
答案 0 :(得分:4)
看一下你的照片 - 你想要的所有范围的结束时间都大于min
,开始时间小于max
。
答案 1 :(得分: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;