我有一个包含轨迹点(x/y坐标)的MySQL表。每行包含TrackID、时间戳以及该轨道在给定时间点的X和Y位置。
我想要的是在给定时间间隔(tmin...tmax)期间活动的所有TrackID的列表,并按其启动时间排序,即使该开始时间在间隔之外。
举个小例子也许会有帮助:

例如:轨道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查询来完成这个任务。我的表包含数百万行,因此这里的效率是个问题。
发布于 2012-06-01 13:56:01
考虑它的一种方法是构造逻辑来处理图表中的四种特殊情况。这两条规则就够了。
如果这两个条件中的任何一个是正确的,那么就应该包括轨道。您将需要一个轨道列表,如在第二个查询中,其中包含它们的min和max值,然后执行比较:
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发布于 2012-06-01 13:52:27
看看你的图片--所有你想要的范围结束时间都大于min,启动时间小于max。
发布于 2012-06-01 13:51:25
不如:
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;https://stackoverflow.com/questions/10851466
复制相似问题