我有两个表。表1以10秒的间隔记录数据,表2中的数据以1或2秒的间隔记录。我想连接这两个表,以便从表1中选择与表2连接的整个数据,其中记录时间匹配或表二中的记录时间接近表1中的记录时间。 例如,表 1 中的一行记录在 21:11:20。如果存在,此行应与 Table2 中记录在 21:11:20 的行连接,否则,选择最近的行,假设在 21:11:19 处的一行。 谢谢。
表1
表2
你可以试试:
select t1.* from table1 t1 inner join table2 t2 on date_trunc('sec',t1.val) = t2.val;
允许使用函数索引的数据库使用此查询的数据库将比不使用函数索引的数据库做得稍好一些。
这需要一点努力,但它显然是可行的(这里:SQL-Server(:
-- set upt a test environment with two tables:
create table tbl1 ( i1 int identity primary key, t1 time, v1 float);
create table tbl10 (i10 int identity primary key, t10 time, v10 float);
-- fill them with some test values:
insert into tbl1 (t1,v1) VALUES ('12:00:06',1),('12:00:07',2),('12:00:08',3),('12:00:09',3),('12:00:10',2),('12:00:11',1),('12:00:12',0);
insert into tbl10 (t10,v10) VALUES ('12:00:00',99),('12:00:10',100),('12:00:20',98),('12:00:30',110);
-- and "join" them with interpolation
WITH t10s AS (
SELECT i10, t10, v10, DATEDIFF(second,0,t10) s10 FROM tbl10
)
SELECT t1,v1, v10a*f+v10b*(1.-f) v10int FROM (
SELECT t1, v1, CAST(b-DATEDIFF(second,0.,t1) AS FLOAT)/(b-a) f, ta.v10 v10a, tb.v10 v10b
FROM (
select t1, v1,
(SELECT max(s10) FROM t10s WHERE t10<=t1) a,
(SELECT min(s10) FROM t10s WHERE t10> t1) b
FROM tbl1
) tmp1
INNER JOIN t10s ta ON ta.s10=a
INNER JOIN t10s tb ON tb.s10=b
) tmp2
-- output:
t1 v1 v10int
12:00:06 1 99.6
12:00:07 2 99.7
12:00:08 3 99.8
12:00:09 3 99.9
12:00:10 2 100.0
12:00:11 1 99.8
12:00:12 0 99.6
在此处查看小演示:https://rextester.com/PQDH85753
在我的基本脚本中,我遇到的情况是t10
值总是大于或小于t1
值。为了防止"超出范围",您可以使用具有在范围外应用的默认值的COALESCE()
函数。