2012-01-24 10 views
1

私はGPSデータを取ってマップを描いていますが、さまざまな時点で最高速度を示したいと思います。私は、各データポイントの速度値を記録し、前のポイントを最大値としてマークすると、それを減らす必要があります。データセットで最高値を取得する

これはMySqlでうまくいくか、PHPでループして値を取得するだけですか? PHP経由で行うのは簡単ですが、実際には必要ないデータを取り出すことも含まれます。

1つのデータセットは、最大で20k行に数千回または数千回かかることがあります。

以下のグラフから、私は4データポイントを返すと思います。テーブルの構造が単純でidは、長い間には、緯度、スピード

EDIT(あまり重要ではないということ)である: idがUUIDである、ではない整数:/

badly drawn example data

+1

明白な質問:どのようにすべてのデータポイントをタッチするPHPなしで地図を描画していますか?言い換えれば、データをプロットするために完全なデータセットを反復処理していませんか? – horatio

+0

私は最後の2つのポイントを記憶していないと言います。だから、常に1点遅れて書く。 –

+0

有効な点ですが、15ポイントの高さがある可能性がある場合は、15k行をループしてさまざまな比較を行います。私の場合はレーストラックの地図なので、コーナーあたり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 

これは、すべての落下間隔、0と内側のクエリ内の他のすべてのケースの速度のための最後の上昇IDとスピードを与え、現在の速度との最後の速度を比較します。そこから、正のIDを持つ行だけを選択します

+0

は正しい方法のように見えるが、私はそれを働かせることはできない。 mysqlはあなたのFROMの後の部分について文句を言います。 "@speed:= 0)AS initspeed" – dogmatic69

+0

@ dogmatic69は私のコードを修正しました –

+0

これはデータを返すようになりました。100%正確であることを確認するためにいくつかのテストを実行します – dogmatic69

1

私はこれを試しましたが、うまく動作します。 PHPよりもパフォーマンスが向上するかどうかは不明ですが、その可能性は高いです。 2つの "temp select"を作成し、それらをrownumで結合します(これらの選択肢を何かで並べ替えることができれば、同じ注文を得ることができ、IDで注文します)。 1つずつ2番目のテーブルをシフトすることによって、A.speed - B.speedは "current"と "previous"の値に違いを与えます。結局のところ、あなたはその差が> 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はそれを禁止します。 – dogmatic69

+0

その部分はrownumA変数を作成し、その値を0に設定し、その「テーブル」から選択します。その部分を使わずに同じことを達成できますが、SET @rownumA = 0を指定します。頂点で。 –

関連する問題