我很喜欢这个。希望我可以用纯 sql 来完成,但此时任何解决方案都可以。
我有ta
和表格,其中包含大约tb
同时发生的事件列表。目标是从on中查找“孤儿”记录。例如:ta
tb
create table ta ( dt date, id varchar(1));
insert into ta values( to_date('20130101 13:01:01', 'yyyymmdd hh24:mi:ss') , '1' );
insert into ta values( to_date('20130101 13:01:02', 'yyyymmdd hh24:mi:ss') , '2' );
insert into ta values( to_date('20130101 13:01:03', 'yyyymmdd hh24:mi:ss') , '3' );
create table tb ( dt date, id varchar(1));
insert into tb values( to_date('20130101 13:01:5', 'yyyymmdd hh24:mi:ss') , 'a' );
insert into tb values( to_date('20130101 13:01:6', 'yyyymmdd hh24:mi:ss') , 'b' );
但是假设我必须使用 +-5 秒的阈值。因此,要查找的查询类似于:
select
ta.id ida,
tb.id idb
from
ta, tb
where
tb.dt between (ta.dt - 5/86400) and (ta.dt + 5/86400)
order by 1,2
(小提琴:http ://sqlfiddle.com/#!4/b58f7c/5 )
规则是:
- 事件映射为 1 到 1
tb
给定事件中最接近的事件ta
将被视为正确的映射。
也就是说,生成的查询应该返回类似
IDA | IDB
1 | a
2 | b
3 | null <-- orphan event
尽管我放在这里的示例查询准确地显示了我遇到的问题。当时间重叠时,很难系统地选择正确的行。
dense_rank()
似乎是选择正确行的答案,但是什么分区/排序将使它们正确?
值得一提的是,我在 Oracle 11gR2 上执行此操作。