我有一个关系:
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
字段中最接近值的元组(绝对值的最小差异)。
当然,问题在于,现实世界的关系每个都包含几千个元组,因此查询速度将获得额外的荣誉。
答案 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
是主键,因此该列的索引已经存在,如果不存在,那么此列也必须编入索引。