获取数据集中的最高值

时间:2012-01-24 22:16:05

标签: php mysql

我正在拍摄GPS数据并绘制地图,我想在各个点显示最高速度。我需要跟踪每个数据点的速度值,如果它减少,则将前一点标记为最大值。

这是我可以在MySql中做得很好的事情,或者我只是在php中循环它并获取值。通过php做很简单,但包括提取不是真正需要的大量数据。

一个数据集可能高达20k行,或者需要几千个。

从下图中我可以看到4个数据点。表结构是简单的id,long,lat,speed(并不重要)

编辑: id是一个uuid,而不是整数:/

badly drawn example data

2 个答案:

答案 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