我正在拍摄GPS数据并绘制地图,我想在各个点显示最高速度。我需要跟踪每个数据点的速度值,如果它减少,则将前一点标记为最大值。
这是我可以在MySql中做得很好的事情,或者我只是在php中循环它并获取值。通过php做很简单,但包括提取不是真正需要的大量数据。
一个数据集可能高达20k行,或者需要几千个。
从下图中我可以看到4个数据点。表结构是简单的id,long,lat,speed(并不重要)
编辑: id是一个uuid,而不是整数:/
答案 0 :(得分:1)
假设你有ids> 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
的行答案 1 :(得分:1)
我试过这个,它运行得很好。不确定它是否会比PHP提高性能,但很可能会。它创建了两个“临时选择”并通过rownum连接它们(如果你可以通过某种东西对这些选择进行排序,那将是很好的,只是为了确保你将得到相同的顺序,我按id排序),然后它使一个连接,但通过将第二个表移动1 ...那样A.speed - B.speed给出“当前”和“前一个”值之间的差异。最后,您只需要记录差异为> 1的记录。 0 ...希望这有帮助。
SELECT A.speed, A.speed - B.speed as diff
FROM
(SELECT @rownumA:=@rownumA+1 AS rownum, speed
FROM speed_table ORDER BY id,
(SELECT @rownumA:=0) r) A
INNER JOIN
(SELECT @rownumB:=@rownumB+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