我正在拍攝GPS數據並繪製地圖,我想在各個點上顯示最高速度。我需要跟蹤每個數據點的速度值,如果它減少,則將前一點標記爲最大值。獲取數據集中的最高值
這是我可以在MySql中很好地完成的事情,還是我只是在PHP中循環並獲取值。通過php完成這項工作非常簡單,但是包括抽出大量並非真正需要的數據。
一個數據集可能高達20k行給或需要幾千。
從下面的圖表我會預期返回4個數據點。表結構簡單的id,長,經緯度,速度(這不是問題多)
編輯: ID是一個UUID,不整數:/
我正在拍攝GPS數據並繪製地圖,我想在各個點上顯示最高速度。我需要跟蹤每個數據點的速度值,如果它減少,則將前一點標記爲最大值。獲取數據集中的最高值
這是我可以在MySql中很好地完成的事情,還是我只是在PHP中循環並獲取值。通過php完成這項工作非常簡單,但是包括抽出大量並非真正需要的數據。
一個數據集可能高達20k行給或需要幾千。
從下面的圖表我會預期返回4個數據點。表結構簡單的id,長,經緯度,速度(這不是問題多)
編輯: ID是一個UUID,不整數:/
假設你有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
相比非常小,似乎是正確的路要走,但我無法得到這個工作。 mysql抱怨你的FROM之後的部分。 「(@speed:= 0)AS initspeed」 – dogmatic69
@ dogmatic69固定了我的代碼 –
它現在正在返回數據,將運行一些更多的測試以確保其100%正確,謝謝 – dogmatic69
我試過這一個,它工作得很好。不知道它是否會提高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
這部分工作究竟在做什麼? (SELECT @rownumA:= 0)r)A.在那個mysql的barfs上。 – dogmatic69
該部分創建rownumA變量並將其值設置爲0,然後從該「表」中進行選擇。你可以在沒有這個部分的情況下實現同樣的事情,但是指定SET @rownumA = 0;在頂部。 –
顯而易見的問題:你如何在沒有PHP觸及所有數據點的情況下繪製地圖?換句話說:您是不是已經在遍歷整個數據集來繪製數據? – horatio
我說要保持內存中的最後兩點。所以,總是寫下一點。 –
有效點,但爲什麼循環15k行進行各種比較時,可能有50個高點。在我的情況下,它是一個賽道的地圖,所以每個角點幾乎有1個高點,而一個賽道有10個 - > 20個角點。與總數據點 – dogmatic69