2017-12-06 12 views
3

datetimedate 필드가 들어있는 큰 테이블이 있습니다. datetime의 두리스트, 즉 afromsatos의리스트를 입력으로받는 함수의 일부로, 이들 각각의 afrom,ato 쌍에 대해 날짜가 큰 큰 테이블의 모든 행을 계산하고 싶습니다.이 쿼리에는 확장 성이 뛰어난 하위 선택이 있습니까?

/ t1 contains my afrom,ato pairs 
q)t1:([] afrom:`datetime$(2017.10.01T10:00:00.000 2017.10.02T10:00:00.000);ato:`datetime$(2017.10.01T12:00:00.000 2017.10.02T12:00:00.000)); 
q)t1 
afrom     ato      
----------------------------------------------- 
2017.10.01T10:00:00.000 2017.10.01T12:00:00.000 
2017.10.02T10:00:00.000 2017.10.02T12:00:00.000 

/t2 contains my very very large dataset 
q)t2:([] date:`datetime$(2017.10.01T10:01:00.000 2017.10.01T10:02:00.000 2017.10.01T10:03:00.000 2017.10.02T10:01:00.000 2017.10.02T10:02:00.000 2017.10.02T10:03:00.000); ccypair:(3#`EURUSD),(3#`USDCHF); mid:6?1.05); 
q)t2 
date     ccypair mid     
---------------------------------------------------- 
2017.10.01T10:01:00.000 EURUSD 0.24256133290473372 
2017.10.01T10:02:00.000 EURUSD 0.091602176288142809 
2017.10.01T10:03:00.000 EURUSD 0.10756538207642735 
2017.10.02T10:01:00.000 USDCHF 0.91046513157198206 
2017.10.02T10:02:00.000 USDCHF 0.76424539103172717 
2017.10.02T10:03:00.000 USDCHF 0.17090452200500295 

그런 다음 나는이 같은 cross 사용할 수 있습니다 :

나는이가 심각한 확장 성 단점이있다, 즉 할 수있는없는 매우 효율적인 방법 밖으로 일

select from (t1 cross t2) where afrom<date,date<ato 

을이 올바른 생산 검색 결과 :

afrom     ato      date     ccypa.. 
-----------------------------------------------------------------------------.. 
2017.10.01T10:00:00.000 2017.10.01T12:00:00.000 2017.10.01T10:01:00.000 EURUS.. 
2017.10.01T10:00:00.000 2017.10.01T12:00:00.000 2017.10.01T10:02:00.000 EURUS.. 
2017.10.01T10:00:00.000 2017.10.01T12:00:00.000 2017.10.01T10:03:00.000 EURUS.. 
2017.10.02T10:00:00.000 2017.10.02T12:00:00.000 2017.10.02T10:01:00.000 USDCH.. 
2017.10.02T10:00:00.000 2017.10.02T12:00:00.000 2017.10.02T10:02:00.000 USDCH.. 
2017.10.02T10:00:00.000 2017.10.02T12:00:00.000 2017.10.02T10:03:00.000 USDCH.. 

그러나 012의 큰 목록및 atoscross은 잠재적으로 큰 테이블 t2의 크기를 t1 번 "불필요하게"확장 할 것이고 확장되지 않습니다.

더 좋은 방법이 있나요? 예 : 나는 다음과 같은 것을 시도했다.

select from t2 where (exec afrom from t1)<date,date<(exec ato from t1) 
error: `length 

나는 루프를 할 필요가 있지만 어떻게할지는 모르겠다. Subquestion .. afromsatos을 분리하는 대신에 간격 튜플, 즉 intervals(afrom;ato)의 sigle 목록을 만들 수 있습니까?

답변

1

내가 어떤 행마다 범위 within 내리는 곳 t1의 각 행을 사용하여 찾을 것이 작업을 수행하는이 올바르게 다음 한 가지 방법을 이해하는 경우 : 위의 yoru 예 출력과 동일 어느

select from t2 where any date within/:value each t1 
date     ccypair mid 
----------------------------------------- 
2017.10.01T10:01:00.000 EURUSD 0.41239 
2017.10.01T10:02:00.000 EURUSD 0.5429457 
... 

을, afromato 열이 없습니다. 이 예에서 범위 내의 모든 값을 선택하고 any 및 각 오른쪽 /:을 사용하면 여러 범위를 사용할 수 있습니다.

raze{[x;y]select from x where date within value y}[t2]'[t1] 

를 창문이 중복되지 않는 경우에 작동합니다 어떤 : 당신은 당신이 개별적으로 t1의 각 행에서 작업 할 수 있습니다이 특히 잘 확장하지 않습니다.

당신은 독점이 필요하거나 다음은 제외하기 위해 약간 윈도우 번 수정을 시도 할 수있는 경우 :

q)select from t2 where any date within/:value each @[t1;`afrom`ato;+;1 -1*00:00:00.001] 
date     ccypair mid 
----------------------------------------- 
2017.10.01T10:01:00.000 EURUSD 0.41239 
2017.10.01T10:02:00.000 EURUSD 0.5429457 
... 

당신이 선택한 행로 교차 할 수있는 출력에 afromato 열을 추가하려면 :

raze{[x;y]flip[1#'y]cross select from x where date within value[y]+1 -1*00:00:00.001}[t2]'[t1] 
afrom     ato      date     ccypair mid 
----------------------------------------------------------------------------------------- 
2017.10.01T10:00:00.000 2017.10.01T12:00:00.000 2017.10.01T10:01:00.000 EURUSD 0.41239 
2017.10.01T10:00:00.000 2017.10.01T12:00:00.000 2017.10.01T10:02:00.000 EURUSD 0.5429457 
... 
+0

답장을 보내 주셔서 감사합니다. ** 불행히도 'within'이 나를 위해 작동하지 않기 때문에 ** exclusive **이 필요함에 유의하십시오. –

+0

실제로이 값은 값이 2 개의 창으로 떨어지면 제외되거나 경계 시간이 제외된다는 것을 의미합니까? –

+0

안녕하세요. 토마스에게 문의 해 주셔서 감사합니다. 경계 시간은 제외되므로'within'을 사용할 수 없습니다. 'afrom, ato'가 일치하지 않으면 행이 없습니다. –