【问题标题】:Order of elements is messed up after using GROUP BY使用 GROUP BY 后元素顺序混乱
【发布时间】:2015-03-03 13:35:35
【问题描述】:

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

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

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

我使用 GROUP BY 函数尝试了以下操作:

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

结果的问题是:GPS 点的顺序搞砸了!它们不是按出现顺序排序的!

如何才能做到这一点?

亲切的问候

西奥

【问题讨论】:

  • 明确指定order by 子句。其他明智的order 的结果不能保证。
  • 是的,问题是,我应该按什么顺序排列结果元素?
  • 如果你想按速度对结果进行排序,那么使用order by 3表示按结果集的第3列排序。
  • 我希望按照 GPS 点的出现顺序对结果进行排序。

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


【解决方案1】:

我很想定义第二个表 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 不保证航点的定义顺序,但是您应该发现它们的定义顺序与 @987654324 的 PK 中它们各自的记录条目的顺序相同@table(我怀疑这是你所追求的);尽管如此,您仍应手动检查(并调整)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
    

【讨论】:

  • 非常感谢!我会完成这个,虽然这需要一些时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多