使用窗口函数 LAG() (推荐,适用于 MySQL 8.0+)
如果你的 MySQL 版本是 8.0 或更高,使用 LAG() 窗口函数是更优雅和高效的选择。LAG() 可以直接访问当前行之前的行数据。
SELECT ROUND(SUM(segment_distance), 2) AS total_distance_meters FROM ( SELECT ST_Distance_Sphere( POINT(longitude, latitude), POINT(LAG(longitude) OVER (ORDER BY id), LAG(latitude) OVER (ORDER BY id)) ) AS segment_distance FROM track_points ) AS distances;说明:
LAG(column) OVER (ORDER BY id): 这个函数会返回当前行按id排序的前一行的column值。LAG(longitude)就是获取前一个点的经度。- 计算分段距离 :在内层查询中,我们为每一行计算它与前一行的距离。第一行由于没有前一行,
LAG()返回NULL,其距离也为NULL,在SUM时会被自动忽略。 - 求和 :外层查询对所有非
NULL的分段距离进行求和。 - 计算分段距离 (
ST_Distance_Sphere) :对每一对相邻的点,使用ST_Distance_Sphere函数计算它们之间的球面距离(单位:米)。