表之间的最近值

时间:2014-01-18 05:56:36

标签: sql postgresql

我有一个关系:

CREATE TABLE mag (
pg_id serial,
nt numeric,
time numeric
);

包含几个元组:

INSERT INTO mag
(nt, time)
VALUES (10,100), (11,200), (12,300), (13,400), (14,500);

我还有另一种关系:

CREATE TABLE gps (
pg_id serial,
x numeric,
y numeric,
time numeric
);

它还包含一些元组:

INSERT INTO gps
(x, y, time)
VALUES (500,500,120), (600,600,180), (700,700,190), (800,800,320), (900,900,800);

我想加入这些表格。 mag关系中的每个元组都应连接到gps关系中具有time字段中最接近值的元组(绝对值的最小差异)。

当然,问题在于,现实世界的关系每个都包含几千个元组,因此查询速度将获得额外的荣誉。

1 个答案:

答案 0 :(得分:0)

试试这个:

SELECT m.pg_id, m.nt, m.time mag_time,
 g.*
FROM (
 SELECT m.pg_id, m.time,
        CASE 
          WHEN  min( g2.time ) is null
           THEN max( g1.time )
          WHEN max( g1.time ) is null
           THEN min( g2.time )
          WHEN 
            m.time - max( g1.time )
            <
            min( g2.time ) - m.time 
          THEN max( g1.time )
          ELSE min( g2.time )
         END join_time
   FROM mag m
   LEFT JOIN gps g1
   ON m.time >= g1.time
   LEFT JOIN gps g2
   ON m.time <= g2.time
   GROUP BY m.pg_id, m.time
) AS j
LEFT JOIN mag m
ON j.pg_id = m.pg_id
LEFT JOIN gps g
ON j.join_time = g.time
;

演示:http://www.sqlfiddle.com/#!15/33fc0/17

要创建gps.time的索引,以加快此查询速度 我假设mag.pg_id是主键,因此该列的索引已经存在,如果不存在,那么此列也必须编入索引。