9

Oracleを使用して複雑なSQLクエリを作成しました。このクエリでは、同じパーティションで2つの分析関数を使用します。

非常に単純にしましょうが、あまり多くはありません。

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句を因数分解するためのより洗練された構文はありますか?

ありがとうございました。

4

3 に答える 3

13

次のような標準のWINDOW句を参照している場合:

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でチェック)。

于 2011-03-29T13:23:31.793 に答える
5

with-clauseとも呼ばれるサブクエリファクタリングを使用できます。

(未テスト)

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

よろしく、
ロブ。

于 2011-03-29T13:20:50.777 に答える
0

WINDOWパーティション定義は句で再利用できます。バージョン20c以降、Oracleはそれをサポートしています。

強化された分析機能

SELECTステートメントのquery_block句は、SQL:2011標準で定義されているSQL標準テーブル式のwindow句を実装するwindow_clauseをサポートするようになりました。

選択する

ここに画像の説明を入力してください

  • OVER window_nameはOVER(window_name…)と同等ではないことに注意してください。OVER(window_name…)は、ウィンドウ仕様をコピーおよび変更することを意味し、参照されるウィンドウ仕様にwindowing_clauseが含まれている場合は拒否されます。

  • windowing_clauseでexisting_window_nameを使用することはできません


クエリは次のように書き直すことができます。

SELECT col1,
       MAX(col2) OVER w AS max_col2,
       MIN(col2) OVER w AS min_col2
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);

ウィンドウ定義の一部を拡張できることに注意してください。たとえば、クエリは共有できますPARTITION BYが、並べ替えが異なります。

SELECT col_x, 
       FIRST_VALUE(col_y) OVER (w ORDER BY col3), 
       FIRST_VALUE(col_z) OVER (w ORDER BY col4)
FROM tab
WINDOW w AS (PARTITION BY col1, col2);

同じウィンドウサイズをPARTITION BY共有するようなsthを実行することはできません。ORDER BY

SELECT col_x, 
       AVG(col_y) OVER (w ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) AS moving_avg_3, 
       AVG(col_y) OVER (w ROWS BETWEEN 5 PRECEDING AND CURRENT ROW) AS moving_avg_5
FROM tab
WINDOW w AS (PARTITION BY col1, col2 ORDER BY col3)
于 2020-02-16T10:15:30.797 に答える