2009-06-14 3 views
2

가입 (?) : 양식 날짜 주식 데이터를 포함 1월 1일 이후의 모든 날짜를 포함복잡한 SQL 내가 2 개 테이블이 쿼리

1) 테이블 Masterdates 1900

2) 테이블 Stockdata, 기호 오픈, 고가, 저가, 가까운, 볼륨 (기본 키 = 날짜, 기호)

이것은 내가 (CSV 형식으로 여기에 제시된) 검색 할 찾고 있어요 무엇

MDate, SDate, 기호, 오픈입니다 , 높음 ...

,363,210 6/4/2001,6/2천1분의 4

, 푸, 47, 49, ...

6/2,001분의 5

, 널, 널, 널, 널 ...

6/6/2001,6/6/2001, Foo, 54,56, ...

여기서 MDate는 Masterdates에서 제공되며 SDate는 Stockdata에서 제공됩니다. 필자는 Stockdata에서 원하는 기호 (이 예제에서는 Foo, 6/4/2001부터 시작)의 첫 번째 (가장 빠른) 범위 날짜부터 시작하여 마지막 날짜까지 Masterdates에 모든 날짜를 포함시켜야합니다. 설명 된 범위에서 주어진 Masterdate 레코드에 해당하는 Stockdata 레코드가없는 경우 Null을 출력하여 Stockdata에서 원하는 기호에 대해 사용할 수있는 최신 날짜를 지정합니다.

단일 쿼리, 일련의 쿼리 또는 보조 테이블을 추가하여 빠른 결과를 얻을 수있는 방법이 있습니까? 아니면 원하는 언어의 상위 집합을 덤프하고 내 (비 SQL) 프로그래밍 언어를 사용하여 최종 출력을 구성해야합니까?

TIA

+0

정확히 어떤 SQL 시스템입니까? MS SQL Server? MySQL은? –

답변

7

sqlite3를 테스트, 귀하의 DB 구현이 다음 pronably 한 쿼리에서 최소 및 최대 값에 대한 변수를 설정하여 성능을 향상시킬 수 quicky 충분히 실행하지 않는 경우

SELECT m.date, 
     s.symbol, 
     s.open, 
     s.high, 
     s.low, 
     s.close, 
     s.volume 
FROM  masterdate AS m LEFT OUTER JOIN 
     stockdata AS s ON m.date = s.date 
AND  s.symbol = 'Foo' 
WHERE m.date >= (SELECT MIN(date) FROM stockdata WHERE symbol = 'Foo') 
AND  m.date <= (SELECT MAX(date) FROM stockdata WHERE symbol = 'Foo') 

다를 수 있고 그런 다음 기본 쿼리의 쿼리를 사용합니다. 이렇게하면 최소한 하나의 색인 조회가 저장됩니다.

그래서 (SQL에서 서버 구문)

SET @symbol = 'Foo' 

SELECT @mindate = MIN(date), 
     @maxdate = MAX(date) 
FROM stockdata 
WHERE stockdata.symbol = @symbol 


SELECT m.date, 
     s.symbol, 
     s.open, 
     s.high, 
     s.low, 
     s.close, 
     s.volume 
FROM  masterdate AS m LEFT OUTER JOIN 
     stockdata AS s ON m.date = s.date 
AND  s.symbol = @symbol 
WHERE m.date BETWEEN @mindate AND @maxdate 

당신은 또한 당신이 masterdate.date에 인덱스 및 stockdata에 복합 인덱스 (날짜, 기호)가 있는지 확인해야합니다.

+0

6GB db에서 22 초. 내가 생각했던 것보다 빠르지 만 내가 필요한 곳이 아니 었습니다. 나는 데이터를 제거하면 훨씬 더 좋은 것으로칩니다. (현재 매일, 일중, 주식, 선물, 인덱스가 있습니다. 하나의 테이블에 데이터가 있습니다.) 감사합니다. – user119282

1

SQLServer를 사용하는 경우 TSQL 저장 프로 시저를 사용하여 결과를 다시 가져올 수 있습니다. 그것은 기본적으로 두 줄 것이다 :

1) 2) 외부와 쿼리 가입 가능한 데이터의 첫 데이트를 얻으려면

Oracle을 사용하는 경우, 당신이 비슷한을 작성하는 PL/SQL을 사용할 수 있습니다 (비록 조금 복잡하지만) 저장 프로 시저를 사용하여 원하는 답을 계산할 수 있습니다.

3

이것은 고전 왼쪽 조인 :

SELECT * FROM masterdates 
    LEFT JOIN stockdata ON masterdates.date = stockdata.date;

는 분명히 이것은 단지 필요한 열을 반환로 정제해야한다.

+0

그러나 이것은 Masterdates의 모든 것을 나에게 줄 것이다. – user119282

0

Stockdata 테이블에서 누락 된 항목을 채우고 내부 조인을 사용하는 것이 좋습니다.훨씬 빨라야합니다.

+0

좀 더 설명해 주시겠습니까? – user35443