2016-10-29 1 views
0

두 소스 (A 및 B)의 가격 업데이트 테이블 두 개가 다음 형식으로 제공됩니다. 다음은 밀리 초 단위로 소스 A에 대한 가격 업데이트입니다 : 나는에 인덱스 (A1, B1 등)를 표시 한MySQL에서 FULL OUTER JOIN으로 테이블 결합 및 병합

index,timestamp,origin,product,bid,ask,nexttimestamp 
B1,2016-10-18 20:39:21.694,B,Dow,7005.8,7006.8,2016-10-18 20:39:27.987 
B2,2016-10-18 20:39:27.987,B,Dow,7005.9,7006.9,2016-10-18 20:39:28.058 
B3,2016-10-18 20:39:28.058,B,Dow,7006.0,7007.0,2016-10-18 20:39:39.792 
B4,2016-10-18 20:39:39.792,B,Dow,7006.2,7007.2,2016-10-18 20:39:39.868 
B5,2016-10-18 20:39:39.868,B,Dow,7006.3,7007.3,2016-10-18 20:39:45.845 

:

index,timestamp,origin,product,bid,ask,nexttimestamp 
A1,2016-10-18 20:39:25.595,A,Dow,7005.5,7007.5,2016-10-18 20:39:34.701 
A2,2016-10-18 20:39:34.701,A,Dow,7005.8,7007.8,2016-10-18 20:39:35.703 
A3,2016-10-18 20:39:35.703,A,Dow,7005.5,7007.5,2016-10-18 20:39:38.432 
A4,2016-10-18 20:39:38.432,A,Dow,7005.8,7007.8,2016-10-18 20:39:44.055 
A5,2016-10-18 20:39:44.055,A,Dow,7005.3,7007.3,2016-10-18 20:39:45.146 

이는 밀리 초에 소스 B의 가격 업데이트됩니다 첫 번째 열. 이 테이블을 결합하고 평평하게해야합니다. 그래서 다른 소스에 대한 업데이트가 도착하면서 각 소스의 현저한 가격을 볼 수 있습니다. 필드 'timestamp'와 'nexttimestamp'는 기본적으로 가격 갱신의 유효 기간에 대한 시작 시간과 종료 시간입니다. nexttimestamp 필드는 테이블의 동일한 소스에 대한 다음 가격 업데이트를 찾아서 만듭니다.

B의 타임 스탬프가 A의 타임 스탬프보다 크고 A의 'nexttimestamp'보다 작은 테이블 A와 B를 가입해야합니다. 즉, 가격 업데이트가 유효한 경우입니다. 나는 그 이런 식으로 뭔가를 보여주고 가입 할 필요가 : 나는하지만 아무 소용이, 예를 들면 다음과 같은 쿼리를 시도하고있다

NULL,                 B1,2016-10-18 20:39:21.694,B,Dow,7005.8,7006.8,2016-10-18 20:39:27.987 
A1,2016-10-18 20:39:25.595,A,Dow,7005.5,7007.5,2016-10-18 20:39:34.701,B1,2016-10-18 20:39:21.694,B,Dow,7005.8,7006.8,2016-10-18 20:39:27.987 
A1,2016-10-18 20:39:25.595,A,Dow,7005.5,7007.5,2016-10-18 20:39:34.701,B2,2016-10-18 20:39:27.987,B,Dow,7005.9,7006.9,2016-10-18 20:39:28.058 
A1,2016-10-18 20:39:25.595,A,Dow,7005.5,7007.5,2016-10-18 20:39:34.701,B3,2016-10-18 20:39:28.058,B,Dow,7006.0,7007.0,2016-10-18 20:39:39.792 
A2,2016-10-18 20:39:34.701,A,Dow,7005.8,7007.8,2016-10-18 20:39:35.703,B3,2016-10-18 20:39:28.058,B,Dow,7006.0,7007.0,2016-10-18 20:39:39.792 
A3,2016-10-18 20:39:35.703,A,Dow,7005.5,7007.5,2016-10-18 20:39:38.432,B3,2016-10-18 20:39:28.058,B,Dow,7006.0,7007.0,2016-10-18 20:39:39.792 
A4,2016-10-18 20:39:38.432,A,Dow,7005.8,7007.8,2016-10-18 20:39:44.055,B3,2016-10-18 20:39:28.058,B,Dow,7006.0,7007.0,2016-10-18 20:39:39.792 
A4,2016-10-18 20:39:38.432,A,Dow,7005.8,7007.8,2016-10-18 20:39:44.055,B4,2016-10-18 20:39:39.792,B,Dow,7006.2,7007.2,2016-10-18 20:39:39.868 
A4,2016-10-18 20:39:38.432,A,Dow,7005.8,7007.8,2016-10-18 20:39:44.055,B5,2016-10-18 20:39:39.868,B,Dow,7006.3,7007.3,2016-10-18 20:39:45.845 
A5,2016-10-18 20:39:44.055,A,Dow,7005.3,7007.3,2016-10-18 20:39:45.146,NULL 

.

select main.*, sub.* 
    from test as main 
    left join test as sub on sub.timestamp > main.timestamp and sub.timestamp < main.nexttimestamp and sub.origin <> main.origin and sub.product = main.product 
    order by main.timestamp ; 
+0

그래서 하나의 테이블 또는 두 개의 테이블이 있습니까? –

+0

두 개의 테이블. 그들은 같은 열을 가지고 있기 때문에 더 쉽게 만들면 다른 하나에 삽입 할 수 있습니다. 그들은 두 개의 다른 소스에서 오는 것처럼 분리되어 있습니다. – user2146441

답변

1

당신은 FULL OUTER를 구축 할 수는 MySQL이 LEFT 조합에 가입 가입 및 RIGHT는 UNION에 가입 : (RIGHT 가입 사항) IS NULL 조건을 필요로하는 두 번째 부분에서

select a.*, b.* 
from table_a a 
left join table_b b 
    on b.timestamp > a.timestamp 
    and b.timestamp < a.nexttimestamp 

union all 

select a.*, b.* 
from table_a a 
right join table_b b 
    on b.timestamp > a.timestamp 
    and b.timestamp < a.nexttimestamp 
where a.index is null 

다른 모든 행 때문에 (LEFT JOIN)에 이미 포함되어 있습니다.

필요하면 ON 절에 조건을 더 추가 할 수 있습니다 (예 : b.product = a.product).