You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:42:24