私はこれに夢中です。純粋なSQLでそれができたらいいのにと思いますが、この時点ではどのソリューションでもかまいません。
ほぼ同時に発生したイベントのリストを含むテーブルがありますta
。目標は、 onから「孤立した」レコードを見つけることです。例えば:tb
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 で行っています。