我每天都沿着同一条路线行驶。这是一个以起点结束的往返旅程。我收集了几次旅行的数据并将其放入 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 识别每条收集到的数据所属的坐标新表。
因此,假设旅程的每个实例都会生成具有相同坐标的记录:
定义并填充新表
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
值,以便正确定义路线。更改现有表以引用这个新表:
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;
使用新航路点数据进行查询:
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/