我每天开往同一条路线。它是一个以起点结束的往返。我从几次旅行中收集了数据并将其放入MySQL表中。
列是: trip_id,time_of_day_in_seconds,纬度,经度,速度,加速度......
我想计算路线的每个GPS点(纬度,经度)的典型值(速度,加速度,......),并按照GPS点的出现顺序对结果进行排序。
我使用GROUP BY函数尝试了以下内容:
SELECT latitude, longitude, avg(speed)
FROM vextended
GROUP BY latitude, longitude
;
结果的问题是:GPS点的顺序搞砸了!它们没有按照外观顺序排序!
如何才能实现这一目标?
亲切的问候
西奥
答案 0 :(得分:0)
我很想定义第二个表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不保证这样定义航点的顺序,但是 应该发现它们的定义顺序与它们各自的记录条目相同。 vextended
表的PK(我怀疑是你之后的那个);但是,您应该手动检查(并调整)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