2011-03-29 3 views
8

같은 파티션에서 두 가지 분석 함수를 사용하려는 복잡한 SQL 쿼리를 Oracle에 작성했습니다.Oracle 분석 함수 - PARTITION BY 절을 다시 사용하는 방법?

이의 너무 많이 아주 간단하지만하자 다음 PARTITION BY 절을 감안위한 더 우아한 구문

SELECT col1, 
     MAX(col2) OVER(PARTITION BY col3, col4, col5, col6, 
            CASE WHEN col7 LIKE 'foo' 
             THEN SUBSTR(col7,1,5) 
             ELSE col7 
            END 
            ORDER BY col5 ASC, col6 DESC), 
     MIN(col2) OVER(PARTITION BY col3, col4, col5, col6, 
            CASE WHEN col7 LIKE 'foo' 
             THEN SUBSTR(col7,1,5) 
             ELSE col7 
            END 
            ORDER BY col5 ASC, col6 DESC) 
    FROM my_table; 

있습니까?

감사합니다.

+0

사용중인 함수가'MAX'와'MIN'이고'col5'와'col6'도'partition'과'order by'에 있다고 생각하면 각 열에 대한'order by' 절이 나타납니다 중복 될 수 있습니다. –

+0

맞습니다. 그러나 이것은 간단한 예를 들어 의도 한 것이며, LAST_VALUE 또는 다른 분석 일 수 있습니다. – Benoit

+0

[동일한 분할 영역에 다중 창 함수 적용] (http://stackoverflow.com/questions/1896102/applying-multiple-window-functions-on-same-partition)의 중복 가능. 이 복제본은 찾기가 쉽지 않았습니다. – Benoit

답변

12

이 같은 표준 창 절을 참조하는 경우 :

SELECT col1, 
     MAX(col2) OVER(w), 
     MIN(col2) OVER(w) 
FROM my_table 
WINDOW w AS (PARTITION BY col3, col4, col5, col6, 
           CASE WHEN col7 LIKE 'foo' 
            THEN SUBSTR(col7,1,5) 
            ELSE col7 
           END 
           ORDER BY col5 ASC, col6 DESC); 

다음 내가 대답은 없는 생각, 오라클은 (11gR2로 확인)이 지원되지 않습니다.

+0

이것이 내가 원했던 것입니다! 고맙습니다. – Benoit

+0

@Benoit :하지만 불행히도 오라클에서는 ** 작동하지 않습니다 **! –

+0

방금 ​​사용하려고하는 것으로 나타났습니다. 그렇게 나쁘다. – Benoit

5

또한으로 알려진 하위 쿼리 인수를 사용할 수와 절 :

(안된)

with t as 
(select col1 
     , col2 
     , col3 
     , col4 
     , col5 
     , col6 
     , case col7 
     when 'foo' then 
      substr(col7,1,5) 
     else 
      col7 
     end col7 
    from my_table 
) 
select col1 
    , max(col2) over (partition by col3,col4,col5,col6,col7 order by col5,col6 desc) 
    , min(col2) over (partition by col3,col4,col5,col6,col7 order by col5,col6 desc) 
    from t 

감사합니다,
롭.

+0

네, 그래도 조금 길어요. 그러나 오라클의 훌륭한 키워드 인 'WITH'제안에 +1합니다. – Benoit

+0

with 절을 "mytable t에서 new_col7 as select t. *, [case expression]"로 줄이고 쿼리에서 new_col7을 사용할 수 있습니다. –

+0

여전히 루트 문제를 해결할 수는 없습니다. 코드에서 여전히 (파티션 바이 바이 ...) 부분을 반복합니다! – Benoit