使用GROUP BY后,元素的顺序混乱

时间:2015-03-03 13:35:36

标签: mysql group-by gps sql-order-by

我每天开往同一条路线。它是一个以起点结束的往返。我从几次旅行中收集了数据并将其放入MySQL表中。

列是:      trip_id,time_of_day_in_seconds,纬度,经度,速度,加速度......

我想计算路线的每个GPS点(纬度,经度)的典型值(速度,加速度,......),并按照GPS点的出现顺序对结果进行排序。

我使用GROUP BY函数尝试了以下内容:

SELECT latitude, longitude, avg(speed)
FROM vextended
GROUP BY latitude, longitude
;

结果的问题是:GPS点的顺序搞砸了!它们没有按照外观顺序排序!

如何才能实现这一目标?

亲切的问候

西奥

1 个答案:

答案 0 :(得分:0)

我很想定义第二个表routes(通过一系列航点定义每个旅程),然后通过FK将每个收集的数据所属的坐标识别为新的表

因此,假设旅程的每个实例都生成相同坐标的记录:

  1. 定义并填充新表routes

    CREATE TABLE routes (
      route_id    BIGINT UNSIGNED NOT NULL,
      waypoint    BIGINT UNSIGNED NOT NULL,
      coordinates POINT           NOT NULL,
      PRIMARY KEY (route_id, waypoint_number)
    ) SELECT   1, @c:=@c+1, POINT(latitude, longitude)
      FROM     vextended, (SELECT @c:=0) init
      WHERE    journey_id = ?  /* filter for one journey only */
    

    MySQL不保证这样定义航点的顺序,但是 应该发现它们的定义顺序与它们各自的记录条目相同。 vextended表的PK(我怀疑是你之后的那个);但是,您应该手动检查(并调整)waypoint值,以便正确定义路径。

  2. 更改现有表格以引用此新表格:

    ALTER TABLE vextended
      ADD COLUMN route_id BIGINT UNSIGNED NOT NULL,
      ADD COLUMN waypoint BIGINT UNSIGNED NOT NULL;
    
    UPDATE vextended v
      JOIN routes    r
        ON r.coordinates = POINT(v.latitude, v.longitude)
       AND r.route_id = 1
    SET    v.route_id = r.route_id,
           v.waypoint = r.waypoint;
    
    ALTER TABLE vextended
      ADD FOREIGN KEY (route_id, waypoint) REFERENCES routes (route_id, waypoint),
      DROP COLUMN latitude,
      DROP COLUMN longitude;
    
  3. 使用新的航点数据进行查询:

    SELECT   waypoint,
             r.coordinates,
             X(r.coordinates) AS latitude,
             Y(r.coordinates) AS longitude,
             AVG(v.speed)
    FROM     vextended v JOIN routes r USING (route_id, waypoint)
    WHERE    route_id = 1
    GROUP BY waypoint