mysql - 使用 GROUP BY 后元素顺序困惑

标签 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 点的顺序搞乱了!它们不是按出现顺序排列的!

如何才能实现这一目标?

亲切的问候

西奥

最佳答案

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

关于mysql - 使用 GROUP BY 后元素顺序困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28833193/

相关文章:

python - 根据另一个数组中列的位置对 numpy 数组进行分组和求和

iphone - 如何检测 "would like to use your current location"选择 Action ?

mysql - 在杂耍者模型中将二进制 16 id 转换为 36 字符 uuid

javascript - 如何清除客户端中服务器端数据表的行

java - Spring MongoDB 聚合组 - 无法正确获取组查询

Android requestLocationUpdates 和获取 gps 修复所需的时间

linux - 任何可以获取我在命令行中的位置的程序

MySQL INSERT INTO SELECT 非常慢

javascript - 在查询中附加单引号 (' ' )

mysql - 从大表中获取重复记录