Ssałem w tym. Chciałbym móc to zrobić w czystym sql, ale w tym momencie zrobi to każde rozwiązanie.wybierz rekordy do porównania zakresów
Mam tabele ta
i tb
, zawierające listy zdarzeń, które wystąpiły w przybliżeniu w tym samym czasie. Celem jest znalezienie "osieroconych" rekordów z ta
na tb
. Np .:
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');
Ale powiedzmy, że muszę użyć progu + -5 sekund. Tak, zapytanie znaleźć będzie wyglądać następująco:
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
(skrzypce: http://sqlfiddle.com/#!4/b58f7c/5)
Zasady są:
- Zdarzenia są mapowane 1 do 1
- Najbliższym wydarzeniem na
tb
dla danego wta
zostanie uznane za poprawne odwzorowanie.
Powiedział, że uzyskany kwerenda powinien powrócić coś jak
IDA | IDB
1 | a
2 | b
3 | null <-- orphan event
Choć przykładowe zapytanie Wrzuciłem tu pokazuje dokładnie problem mam. Kiedy czas się nakłada, trudno jest systematycznie wybrać właściwy wiersz.
dense_rank()
wydaje się być odpowiedzią, aby wybrać odpowiednie wiersze, ale co do partycjonowania/Sortowanie będzie umieścić je w porządku?
Warto wspomnieć, że robię to na Oracle 11gR2.
Brzmi to bardzo trudne, i myślę, że istnieją pewne wymagania, które muszą być wyjaśnione. Na przykład, dlaczego dopasowałeś '1' do' a', kiedy '3' i' a' pasują bliżej? (Czy chcesz spożywać zapisy w kolejności ta.dt?) Co się dzieje, jeśli są więzy? Na przykład, co jeśli były dwa wiersze "b"? Czy jeden rząd odpowiada 2, a drugi 3, czy obaj pasują do 2? –
zgodnie z twoją definicją wygląda na to, że sierota powinna być 3 – haki
@Jonearles masz rację, może to zająć trochę wyjaśnienia. Główną zasadą jest tutaj * zdarzenia są odwzorowywane od 1 do 1 *.Oznaczałoby to, że "konsumowane są wydarzenia" po dopasowaniu - nie wspomniałem o tym, ponieważ wydaje się to implikować proces iteracyjny, który może być zbyt skomplikowany. W przypadku więzi, zrobi to dowolny rekord. Najlepiej byłoby przyjąć kolejność chronologiczną, ale tak naprawdę nie ma znaczenia, o ile przestrzegane jest mapowanie od 1 do 1. Czy odpowiedziałem na twoje pytanie? – filippo