8

トラックのポイント (x/y 座標) を含む MySQL テーブルがあります。各行には、特定の時点でのそのトラックの TrackID、タイムスタンプ、および X 位置と Y 位置が含まれます。

私が欲しいのは、特定の時間間隔 (tmin...tmax) 中にアクティブだったすべての TrackID のリストであり、その開始時間が interval の外にある場合でも、開始時間で並べ替えられます。

ちょっとしたイラストが役立つかもしれません:

図

例として、トラック 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;

次に、個別のクエリを使用して、これらすべてのトラックの開始時間を見つけ、アプリケーション コードで並べ替えます。

しかし、1 つの SQL クエリでこれを行う方法があると確信しています。私のテーブルには何百万もの行が含まれているため、ここでは効率が問題になります。

4

4 に答える 4

4

画像を見てください。必要なすべての範囲の終了時間が より大きくmin、開始時間が より小さくなっていmaxます。

于 2012-06-01T13:52:27.070 に答える
3

これについて考える 1 つの方法は、ダイアグラム内の 4 つの特殊なケースを処理するロジックを構築することです。この 2 つのルールで十分です。

  1. 傾向 > tmin AND
  2. tstart < tmax

これら 2 つの条件のいずれかが true の場合、トラックを含める必要があります。2 番目のクエリのように、最小値と最大値を含むトラックのリストが必要になり、比較を実行します。

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-01T13:56:01.373 に答える
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;
于 2012-06-01T13:51:25.597 に答える
-1

2 番目のクエリで正しい軌道に乗っていましたORDER BY。句を追加するだけです。

SELECT DISTINCT TrackID 
FROM Tracks 
WHERE Timestamp BETWEEN tmin AND tmax 
GROUP BY TrackID 
ORDER BY Timestamp;
于 2012-06-01T13:51:59.090 に答える