2011-03-29 21 views
8

我已經用Oracle編寫了一個複雜的SQL查詢,我想在同一個分區上使用兩個分析函數。Oracle分析函數 - 如何重用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; 

是否有融通PARTITION BY條款更優雅的語法?

謝謝。

+0

考慮到你正在使用的函數是'MAX'和'MIN'以及'col5'和'col6'在'partition'和'order by'中,每列的'by by'子句出現是多餘的。 – 2011-03-29 13:25:44

+0

你是對的,但這只是一個簡單的例子,它可能是LAST_VALUE或任何其他分析。 – Benoit 2011-03-29 13:29:32

+0

[在同一分區上應用多個窗口函數]的可能重複(http://stackoverflow.com/questions/1896102/applying-multiple-window-functions-on-same-partition)。這個副本不容易找到。 – Benoit 2011-03-30 07:15:04

回答

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); 

那麼我相信答案是沒有,Oracle不支持這樣(11gR2的檢查)。

+0

這就是我想要的!謝謝。 – Benoit 2011-03-29 13:26:53

+0

@Benoit:但不幸的是它不**在Oracle工作! – 2011-03-29 13:31:22

+0

我剛剛注意到,試圖使用它。太糟了。 – Benoit 2011-03-29 13:33:26

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,這是Oracle中一個非常棒的關鍵字。 – Benoit 2011-03-29 13:27:39

+0

您可以將with子句縮短爲「從mytable t中選擇t。*,[case expression] as new_col7」,並在查詢中使用new_col7。 – 2011-03-29 13:43:33

+0

儘管如此,它並不能真正解決根本問題:在你的代碼中,你仍然重複'(partition by ...)'部分! – Benoit 2011-03-29 13:46:16

相關問題