SELECT JOIN查询异常:如何按时间段过滤各段GPS日志?
问题:按轨迹段起止时间过滤GPS日志
我的数据库包含两张表:
- table_A:存储轨迹段统计信息,字段含轨迹段ID、会话ID、轨迹段起始时间、起止坐标、长度等,建表语句:
CREATE TABLE table_A(segment_id INT NOT NULL, session_id INT NOT NULL, segment_start_sec INT NOT NULL, lat_start DOUBLE PRECISION, lon_start DOUBLE PRECISION, lat_end DOUBLE PRECISION, lon_end DOUBLE PRECISION, length DOUBLE PRECISION)
- table_B:存储所有轨迹段的GPS日志(采样率1秒),字段含会话ID、时间秒数、经纬度,建表语句:
CREATE TABLE table_B(session_id INT NOT NULL,seconds INT NOT NULL, lat DOUBLE PRECISION, lon DOUBLE PRECISION)
我尝试查询每个轨迹段从开始到结束的GPS日志,执行了以下语句:
SELECT a.segment_id, b.seconds, b.lat, b.lon FROM table_A a LEFT JOIN table_B b ON a.session_id = b.session_id
但结果不符合预期:所有轨迹段返回的日志行数都等于最长轨迹段的日志数(例如segment_id=0、12、16的查询结果均为289行),显然没有按每个轨迹段的起止时间过滤日志。
解决方案
问题根源在于JOIN条件仅匹配了session_id,未限定GPS日志的时间范围。需要在JOIN的ON子句中,添加b.seconds落在当前轨迹段时间区间内的条件:
每个轨迹段的起始时间为a.segment_start_sec,结合1秒的采样率,结束时间可通过a.segment_start_sec + a.length计算(假设length字段单位为秒)。
修正后的查询语句:
SELECT a.segment_id, b.seconds, b.lat, b.lon FROM table_A a LEFT JOIN table_B b ON a.session_id = b.session_id -- 限定GPS日志时间在轨迹段的起止区间内 AND b.seconds >= a.segment_start_sec AND b.seconds <= a.segment_start_sec + a.length
若需统计每个轨迹段的有效日志数量,可使用以下查询:
SELECT a.segment_id, COUNT(b.seconds) AS log_count FROM table_A a LEFT JOIN table_B b ON a.session_id = b.session_id AND b.seconds >= a.segment_start_sec AND b.seconds <= a.segment_start_sec + a.length GROUP BY a.segment_id
内容的提问来源于stack exchange,提问作者arilwan
相关产品推荐
相关产品推荐

