2012-01-24 47 views
1

我正在拍攝GPS數據並繪製地圖,我想在各個點上顯示最高速度。我需要跟蹤每個數據點的速度值,如果它減少,則將前一點標記爲最大值。獲取數據集中的最高值

這是我可以在MySql中很好地完成的事情,還是我只是在PHP中循環並獲取值。通過php完成這項工作非常簡單,但是包括抽出大量並非真正需要的數據。

一個數據集可能高達20k行給或需要幾千。

從下面的圖表我會預期返回4個數據點。表結構簡單的id,長,經緯度,速度(這不是問題多)

編輯: ID是一個UUID,不整數:/

badly drawn example data

+1

顯而易見的問題:你如何在沒有PHP觸及所有數據點的情況下繪製地圖?換句話說:您是不是已經在遍歷整個數據集來繪製數據? – horatio

+0

我說要保持內存中的最後兩點。所以,總是寫下一點。 –

+0

有效點,但爲什麼循環15k行進行各種比較時,可能有50個高點。在我的情況下,它是一個賽道的地圖,所以每個角點幾乎有1個高點,而一個賽道有10個 - > 20個角點。與總數據點 – dogmatic69

回答

1

假設你有ID> 0:

SELECT id, speed FROM (
    SELECT 
    if(speed<@speed,@id,0) AS id, 
    if(speed<@speed,@id:=0,@id:=id) AS ignoreme, 
    @speed:=speed AS speed 
    FROM 
    (SELECT @speed:=0) AS initspeed, 
    (SELECT @id:=0) AS initid, 
    yourtable 
    WHERE ... 
) AS baseview 
WHERE id>0 

這將比較過去的速度與當前的速度,給最後上升ID和速度每下降區間,0和速度在內部查詢所有其他情況。從那我們只選擇那些行,有一個積極的ID

+0

相比非常小,似乎是正確的路要走,但我無法得到這個工作。 mysql抱怨你的FROM之後的部分。 「(@speed:= 0)AS initspeed」 – dogmatic69

+0

@ dogmatic69固定了我的代碼 –

+0

它現在正在返回數據,將運行一些更多的測試以確保其100%正確,謝謝 – dogmatic69

1

我試過這一個,它工作得很好。不知道它是否會提高PHP的性能,但最有可能的。它創建了兩個「臨時選擇」並通過rownum將它們連接起來(如果可以按某種方式對這些選擇進行排序,只是爲了確保您會得到相同的順序,我按照順序排列),然後它會生成一個連接,但通過將第二個表格移動1 ...這樣A.speed - B.speed給出「當前」和「前一個」值之間的差異。最後,你只需要記錄差異大於0的記錄...希望這有助於。

SELECT A.speed, A.speed - B.speed as diff 
FROM 
    (SELECT @rownumA:[email protected]+1 AS rownum, speed 
    FROM speed_table ORDER BY id, 
    (SELECT @rownumA:=0) r) A 
INNER JOIN 
    (SELECT @rownumB:[email protected]+1 AS rownum, speed 
    FROM speed_table ORDER BY id, 
    (SELECT @rownumB:=0) r) B ON A.rownum = B.rownum - 1 
WHERE A.speed - B.speed > 0 
+0

這部分工作究竟在做什麼? (SELECT @rownumA:= 0)r)A.在那個mysql的barfs上。 – dogmatic69

+0

該部分創建rownumA變量並將其值設置爲0,然後從該「表」中進行選擇。你可以在沒有這個部分的情況下實現同樣的事情,但是指定SET @rownumA = 0;在頂部。 –