首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL查询:按启动时间排序的在给定时间间隔内活动的所有ID的列表。

SQL查询:按启动时间排序的在给定时间间隔内活动的所有ID的列表。
EN

Stack Overflow用户
提问于 2012-06-01 13:44:46
回答 4查看 383关注 0票数 8

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

我想要的是在给定时间间隔(tmin...tmax)期间活动的所有TrackID的列表,并按其启动时间排序,即使该开始时间在间隔之外。

举个小例子也许会有帮助:

例如:轨道1从t11到t12都是活动的,这意味着我的表中有许多行带有ID=1,具有从t11到t12的时间戳。

预期的产出将是:

代码语言:javascript
运行
复制
TrackID | StartTime
--------+-----------
    7   |    t71
    1   |    t11
    2   |    t21
    6   |    t61

我试过这样的方法:

代码语言:javascript
运行
复制
SELECT TrackID, MIN(Timestamp) AS StartTime FROM Tracks WHERE Timestamp BETWEEN tmin AND tmax GROUP BY TrackID ORDER BY StartTime;

但是,在上面的示例中,我没有得到轨道1和7的实际启动时间,因为所有时间戳小于tmin的行都不考虑。

当然,我可以在第一步获得所有活动的TrackID

代码语言:javascript
运行
复制
SELECT TrackID FROM Tracks WHERE Timestamp BETWEEN tmin AND tmax GROUP BY TrackID;

然后使用单独的查询,查找所有这些轨道的开始时间,然后在我的应用程序代码中对它们进行排序。

但是我确信有一种方法可以用一个SQL查询来完成这个任务。我的表包含数百万行,因此这里的效率是个问题。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-01 13:56:01

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

  1. 趋向> tmin和
  2. tstart< tmax

如果这两个条件中的任何一个是正确的,那么就应该包括轨道。您将需要一个轨道列表,如在第二个查询中,其中包含它们的min和max值,然后执行比较:

代码语言:javascript
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2012-06-01 13:52:27

看看你的图片--所有你想要的范围结束时间都大于min,启动时间小于max

票数 4
EN

Stack Overflow用户

发布于 2012-06-01 13:51:25

不如:

代码语言:javascript
运行
复制
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;

我认为这样做更好:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10851466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档