2012-06-01 30 views
8

我有一個包含軌道點(x/y座標)的MySQL表。每行包含TrackID,時間戳,以及該給定時間點的該軌道的X和Y位置。SQL查詢:在給定時間間隔內活動的所有ID的列表(按其開始時間排序)

我想要的是在給定的時間間隔(tmin ... tmax)內激活的所有TrackID列表,按其開始時間排序即使開始時間在之間。

小插圖可能有幫助:

Illustration

作爲一個例子:軌道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的行根本不被考慮。

當然,我可以在第一步中只得到所有活動TrackIDs與

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

,然後用單獨的查詢找到所有這些曲目的開始時間,然後在我的應用程序代碼進行排序。

但我相信有一種方法可以用一個SQL查詢來做到這一點。我的表格包含數百萬行,因此效率是一個問題。

+0

甚至開始時間之外,怎麼樣完成時間......你想相同的行爲? – DonCallisto

+0

我不在乎這個應用程序的結束時間。 –

+1

開始時間和結束時間是否可能在tmin和tmax之外,tmin和tmax之間沒有時間戳?如果是這樣,那麼你的第二個查詢將在這種情況下有一個錯誤的否定。 – mellamokb

回答

3

思考它的一種方法是構建邏輯來處理圖中的四個特例。這兩條規則就足夠了。

  1. 傾向於> min和
  2. TSTART <最高溫度

如果有這兩個條件都爲真,則軌道應包括在內。你需要的曲目列表,如你與他們的最小值和最大值第二個查詢,然後進行比較:

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 
+1

我的查詢中沒有它,但是您可以選擇'T.StartTime'來獲取開始時間,'ORDER BY T.StartTime'按軌道的開始時間排序。 – mellamokb

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; 
+0

這聽起來很有希望。我會在星期一檢查它! –

+0

我剛剛意識到它並不完全正確。您需要向子查詢中的表添加別名並將其鏈接到主表。我可以在SQL Server中執行此操作,但我將首先檢查它是否與MySQL相同 – CompanyDroneFromSector7G

+0

這與我的解決方案非常相似(我已刪除,因爲我注意到了一些我在註釋中也注意到的事情)。這將不起作用。考慮一下:如果t1(即在「t」的時刻將包括在範圍內)如何在給定間隔之外還有開始和結束時間?它將被列出,並且開始時間可能會更小! – DonCallisto

-1

你是對的跟蹤你的第二個查詢,你只需要添加一個ORDER BY子句。

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

我想我會用這種方法得到1和7的錯誤開始時間。但我會在星期一檢查。 –

+0

這會給你你所要求的,「我想要的是在給定的時間間隔(tmin ... tmax)內活動的所有TrackID列表,按其開始時間排序,即使開始時間在外間隔「。 SELECT/WHERE返回開始和結束之間的相關時間戳的TrackID列表,然後按照最小時間戳排序。 – Sean

4

看看你的照片 - 你想要有結束時間比min更大,啓動時間小於max範圍。

+0

@mellamokb我糾正了錯誤 - 只是忘了寫'和開始時間'小於... –

+0

同意,給了你+1 :) – mellamokb

+0

@mellamokb現在沒有意思寫一個查詢,你已經呈現給你: - ) –

相關問題