2009-08-04 5 views
1

다음 두 쿼리 간의 차이점은 무엇입니까? 모두 다른 행을 반환두 개의 분석 쿼리의 차이점

with ordered_table as 
(
select * from table order by column1 
) 
select first_value(column2 ignore nulls) over (partition by column3) 
from ordered_table; 

select first_value(column2 ignore nulls) over (partition by column3 order by column1) 
from table; 

참고 : 나는 테스트 케이스를 제공하기 위해 노력하겠습니다 그러나 나는 사람을 명확이 필요하지 않은 개념을 가지고 있다고 생각합니다.

답변

0
WITH ordered_table AS 
     (
     SELECT * 
     FROM table 
     ORDER BY 
       column1 
     ) 
SELECT FIRST_VALUE(column2 IGNORE NULLS) OVER (PARTITION BY column3) 
FROM ordered_table 

이 쿼리는 특별한 순서없이 column2의 첫 번째 당 파티션 값을 반환합니다 (전. 전자. CBO는 최고의 고려 순서를 자유롭게 선택할 수있다).

SELECT FIRST_VALUE(column2 IGNORE NULLS) OVER (PARTITION BY column3 ORDER BY column1) 
FROM table; 

이 쿼리는 column1으로 정렬 파티션, column2의 첫 번째 당 파티션 값을 반환합니다. SQL 언어 세트에서 작동하고 ORDER BY 절은 CTE에 반환 된 세트와 아무것도하지 않는다

때문에, Oracle 그냥 ORDER BY 부분을 무시합니다.

CBO

는 해시를 실현하기 위해 선택하거나이 외부 쿼리에 의해 사용되는, 그래서 CTE에 사용 된 ORDER BY가 외부 쿼리에 대한 손실되기 전에 다른 방법으로 CTE을 토막 할 수 있습니다.

0

column1에 의한 정렬은 첫 번째 쿼리에서 실제로 아무 것도하지 않습니다.

순서대로 결과 집합을 만들지 만 귀하의 파티션 문에 포함되지는 않습니다. 순서는 실제 파티션 절에 있습니다.

0

첫 번째 버전은 column1로 설정된 전체 행을 정렬 한 다음 column3으로 파티션을 나누고 분석 계산을 수행합니다. column1에 의한 초기 정렬은 반드시 파티셔닝을 통해 보존되지는 않는다는 것을 알아 두십시오. 이것은 아마도 당신을 매달아 놓은 것이라고 생각합니다.

두 번째 버전은 데이터를 column3으로 분할 한 다음 각 partition 내에서 column1별로 정렬 한 다음 분석 출력을 결정합니다.

관련 문제