2017-02-07 1 views
0

SQL Server 쿼리를보다 효율적으로 만드는 것에 대한 질문이 있습니다.하위 쿼리를 사용하는 쿼리 정리

나는 다음과 같은 열이 나는 값이 0보다 큰 일로부터 각 ID에 대한 행을 선택합니다

ID   int 
ValueDate datetime 
Value  float 

있는 테이블을 가지고있다. 이것은 내가 가진 SQL이다.

SELECT a.ID, a.ValueDate, a.Value 
FROM MyTable a, 
(SELECT ID, MIN(ValueDate) as VDate FROM MyTable WHERE Value > 0 GROUP BY ID) B 
WHERE a.ID = b.ID and a.ValueDate >= b.VDate 

이 작업은 가능하지만 더 효율적인 방법이 있는지 궁금하다. 하나의 테이블을 하위 쿼리로 대체해야하기 때문에 다른 양식을 보는 데 특히 관심이 있습니다. 쿼리가 동일한 하위 쿼리를 두 번 실행하므로 실행 속도가 느려지므로 걱정됩니다. 하위 쿼리가 한 번만 실행되도록 쿼리를 조정할 수 있습니까? 이 쿼리는 Oracle과 Access 데이터베이스에서도 쿼리를 실행해야하기 때문에 다른 두 데이터베이스 시스템에서 대신 사용할 수있는 SQL Server가없는 한 SQL Server는 사용할 수 없습니다.

+0

'ID'는 고유하지 않습니까? 나에게 명확하지 않은 이유는'GROUP'을 사용하는 이유 – anatol

+0

단순히 SELECT a.ID, a.ValueDate, a.Value FRT MyTable a WHERE a.Value> 0'을 사용하지 않는 이유는 무엇입니까? – anatol

+0

anatol --- ID와 날짜 열이 고유 키를 구성합니다. 첫 번째 0이 아닌 값으로 시작하는 데이터를 수집하려고하기 때문에 GROUP BY를 사용하지만 그 다음에 0 값이 있으면 그 값을 유지해야합니다. – user1753352

답변

0

그래서, 귀하의 설명에서 알 수 있듯이 중복 된 하위 쿼리에 문제가 있습니다.

SELECT [ID] 
     ,[ValueDate] 
     ,[Value] 
    FROM [MyTable] 

ID ValueDate    Value 
1 2017-06-02 12:14:55.000 0 
1 2017-07-02 12:14:55.000 0,1 
1 2017-08-02 12:14:55.000 0,2 
2 2017-08-02 12:14:55.000 0,2 

따라서, 귀하의 요청에주는 다음 결과 : 예를 들어 우리는 우리의 테이블에 다음 행이

ID ValueDate    Value 
1 2017-07-02 12:14:55.000 0,1 
1 2017-08-02 12:14:55.000 0,2 
2 2017-08-02 12:14:55.000 0,2 

을하며 같은 결과를 제공 SELECT a.ID, a.ValueDate, a.Value FROM MyTable a WHERE a.Value > 0로 단순화 할 수있다.

하위 쿼리는 조인에 대해서만 해당 행을 반환하므로 사용 이유는 무엇입니까? 나는 왜 당신이 그것을 사용하는지 이해하지 못합니다.

+0

이것은 시계열 데이터입니다. 한 달에 하나의 가치. 데이터 그래프를 청결하게하기 위해 나는 0이 아닌 첫 번째 값으로 월을 시작하겠습니다. 그러나 그 후 나는 매월, 가치가 0 인 사람들조차 필요합니다. 따라서 그로 시작하는 달을 찾는 하위 쿼리는 0이 아닌 값이있는 첫 번째 달입니다. – user1753352

관련 문제