2011-09-11 4 views
0

SQL Server 2008 R2 데이터베이스는 몇 가지 옵션에 대해 각각 1 분 간격으로 거래 레코드가 있으며 각 분에는 여러 만료에 대한 레코드가 들어 있습니다. 예 :올바른 SQL 문은 앞쪽 만료 계약을 나타내는 올바른 행을 반환합니다.

Symbol, TradeDate, Expiry, Open, High, Low, Close 
AMZN, 4/01/2009 9:31:00, 4/17/2009, 8, 10, 9, 8.5 
AMZN, 4/01/2009 9:31:00, 5/17/2009, 10, 11, 10, 11 
AMZN, 4/01/2009 9:31:00, 6/18/2009, 12,13,12,12 
GOOG, 4/01/2009 9:31:00, 4/17/2009, 8, 9, 7, 7.5 
AMZN, 4/01/2009 9:32:00, 4/17/2009, 8.2, 8.9, 8.3, 8.5 
AMZN, 4/01/2009 9:32:00, 5/16/2009, 3, 4, 4, 4 
... 
AMZN, 4/20/2009 9:31:00, 5/16/2009, 8.5, 9, 8.75, 8.75 
AMZN, 4/20/2009 9:31:00, 6/18/2009, 9, 10, 9, 9.2 

옵션에서 항상 앞 부분 계약의 개념이 있습니다. 이 문제의 경우, 앞 달 계약을 다음과 같이 정의하십시오. 해당 계약의 만기 날짜보다 적은 TradeDate 항목이있는 경우, 이는 앞 달입니다. 그렇지 않으면 앞쪽 달은 다음 달 계약입니다. 예를 들어, 위의 데이터에서 2009 년 4 월 1 일 AMZN 앞쪽 달은 4/17/2009에 만료되는 계약입니다. 그러나 TradeDate 4/20/2009로 이동할 때, 앞의 달은 2007 년 4 월 17 일 계약이 주말에 만료 된 이후 5/16/2009 계약입니다.

TradeDate가 무엇인지에 따라 "앞 달 계약"을 제공하는 올바른 행을 항상 반환하는 SQL 문은 무엇입니까?

+0

주어진 예제 데이터에 대해 EXPECTED 출력을 추가 할 수 있습니까? 이것은 당신이 원하는 것을 결정하고 정확한 쿼리를 줄 때 나를 도울 것입니다. – danishgoel

답변

0

귀하가 설명한 것으로부터. 다음 질의가이를 수행해야합니다. 자체 조인 :

SELECT T1.Symbol, T1.TradeDate, T1.Expiry, MIN(T2.expiry) AS FrontMonrhContract, T1.Open, T1.High, T1.Low, T1.Close FROM <TABLE> T1, <TABLE> T2 WHERE T1.TradeDate <= T2.Expiry GROUP BY T1.Symbol , T1.TradeDate, T1.Expiry 

FrontMonth 계약 거래에 대한 항목이 없으면 작동하지 않습니다.
기분이 좋을 것 같은 것은 당신이 만료 목록을 입력하거나 지난 금요일 또는 그와 비슷한 것 (규칙이있는 경우)과 같은 규칙에 따라 계산한다는 것입니다. frontMonth 계약에 대한 거래가 없다면 앞쪽 달을 잘못 계산할 위험이 없습니다.

SQL은 이러한 작업을위한 것이 아니기 때문에 SQL 대신 응용 프로그램에서 더 잘 수행하십시오. 응용 프로그램에서는 만료 목록과 간단한 비교가됩니다.
SQL 대신 응용 프로그램 자체에서 이러한 계산을 수행하여 sqlite 데이터베이스의 데이터에서 작동하는 차트 기능의 실행 시간을 90 % 이상 단축했습니다.

업데이트 :
다음 쿼리를 사용해보십시오. 테이블 이름을 TRADES로 가정합니다.

SELECT 
    T1.Symbol, 
    T1.TradeDate, 
    T1.Expiry, 
    MIN(T2.expiry) AS 'FrontMonrhContract' , 
    MIN(T1.[Open]) AS 'Open', 
    MIN(T1.[High]) AS 'High', 
    MIN(T1.[Low]) AS 'Low', 
    MIN(T1.[Close]) AS 'Close' 
FROM 
    TRADES T1, TRADES T2 
WHERE T1.TradeDate <= T2.Expiry AND T1.Symbol = T2.Symbol 
GROUP BY T1.Symbol , T1.TradeDate, T1.Expiry 

방금 ​​질문에 제공 한 데이터로 샘플 테이블을 작성했으며이 쿼리는 해당 데이터 세트에서 예상대로 작동합니다. 참고 내가 SQL 서버 2005

업데이트 2가 : 쿼리의 실행을 최적화하기 위해
를 순서대로 열 Symbol, TradeDate, Expiry하여 세 그룹으로 인덱스를 추가하려고합니다.
쿼리 실행 계획을 만들었고 60 % 이상의 시간이 GROUP BY를 해결하기위한 것이고 샘플 데이터베이스에이 인덱스를 추가 한 후에는 완전히 사라졌습니다.

+0

2 개가 아니라 하나의 테이블 만 있습니다. 나는 당신이 T1과 T2에 의해 의미하는 것이라고 생각합니다. – Ivan

+0

예 하나의

이 있습니다.이 자체 조인은 자체 테이블과 조인입니다. T1과 T2는 동일한 테이블에 대한 별칭이므로 필요한 열을 명확하게 참조 할 수 있습니다. 그래서 위의 쿼리에서
은 양쪽 거래 테이블의 이름으로 대체됩니다. – danishgoel

+0

감사합니다. 이제 실제로 쿼리를 올바르게 작성하는 방법을 살펴 보았으므로 작동하지 않습니다. 나는 2009-04-19 09 : 31 : 00.00에 2009-04-18과 2009-05-16 만료에 대한 항목을 얻었습니다.) 내가 성취하려는 것을 분명히하지 않는 한. 매일 매일의 분마다 독특한 월간 계약이 있습니다. – Ivan

관련 문제