1 回答

TA貢獻1853條經驗 獲得超18個贊
您可以利用自 5.7 起提供的 MySQL 空間支持在數據庫中執行整個計算。函數ST_Distance_Sphere()可用于計算距離。
您實際上需要距離的累積總和(這需要窗口函數,自 MySQL 8.0 起可用)。
考慮:
SELECT
id,
time,
SUM(
CASE WHEN lag_lat IS NULL
THEN 0
ELSE ST_Distance_Sphere(point(lag_lon, lag_lat), point(lon, lat))
END
) OVER (ORDER BY time) cumulative_distance
FROM (
SELECT
d.*,
LAG(lat) OVER(ORDER BY time) lag_lat,
LAG(lon) OVER(ORDER BY time) lag_lon
FROM distance d
) x
DB Fiddle 上的演示:
| id | time | cumulative_distance |
| --- | ---------- | ------------------- |
| 1 | 1571004620 | 0 |
| 2 | 1571004630 | 168.37177423236415 |
| 3 | 1571004640 | 336.7435484657999 |
| 4 | 1571004650 | 673.4870969097663 |
在早期版本的 MySQL 中,您需要模擬窗口函數:
LAG()可以替換為LEFT JOIN帶有條件的self-和條件NOT EXISTS中的相關子查詢ON
變量可以模擬累積SUM
詢問:
SELECT
id,
time,
@running_distance := @running_distance + CASE
WHEN lag_lat IS NULL THEN 0
ELSE ST_Distance_Sphere(point(lag_lon, lag_lat), point(lon, lat))
END running_distance
FROM (
SELECT
d.id,
d.time,
d.lat,
d.lon,
d_lag.lat lag_lat,
d_lag.lon lag_lon
FROM distance d
LEFT JOIN distance d_lag
ON d_lag.time < d.time
AND NOT EXISTS (
SELECT 1
FROM distance d1
WHERE d1.time < d.time AND d1.time > d_lag.time
)
ORDER BY d.time
) x
CROSS JOIN (SELECT @running_distance := 0) y
添加回答
舉報