3

サンプル データに対してパーティション クエリを実行しようとしています。ORDER BY 句を削除すると、結果が異なります。結果が異なる理由は何ですか。以下のリンクを確認してください。

http://www.sqlfiddle.com/#!4/a0f10/5

SELECT MAX(B1.ET) OVER(PARTITION BY B1.MAS_DIV_KEY,B1.STN_KEY,B1.SBSC_GUID_KEY ORDER BY B1.ST)AS TEST_COL
FROM AM_PROGRAM_TUNING_EVENT_TMP1 B1;


SELECT MAX(B1.ET) OVER(PARTITION BY B1.MAS_DIV_KEY,B1.STN_KEY,B1.SBSC_GUID_KEY)AS TEST_COL1
FROM AM_PROGRAM_TUNING_EVENT_TMP1 B1;

ここに画像の説明を入力

ここに画像の説明を入力

4

2 に答える 2

4

通常は並べ替えの影響を受けない集計 (min、max、stdev など) の OVER() 句内に order by がある場合、それは実行中の小計になります。より完全な処理については、以下の質問に対する Justin Cave の回答を参照してください。

分析関数としての Oracle MIN - ORDER BY の奇妙な動作?

編集

ここで sqlfiddle を参照します。

http://www.sqlfiddle.com/#!4/a0f10/33

最初のクエリ:

SELECT B1.ST
  , B1.ET
  , MAX(B1.ET) 
    OVER(PARTITION BY B1.MAS_DIV_KEY
             ,B1.STN_KEY
             ,B1.SBSC_GUID_KEY 
         ORDER BY B1.ST
         ) AS TEST_COL
FROM AM_PROGRAM_TUNING_EVENT_TMP1 B1
ORDER BY B1.ST;

... 戻り値

ST                            ET                            TEST_COL
March, 28 2012 11:00:00-0700  March, 28 2012 11:05:00-0700  March, 28 2012 11:05:00-0700
March, 28 2012 11:03:00-0700  March, 28 2012 11:15:00-0700  March, 28 2012 11:50:00-0700
March, 28 2012 11:03:00-0700  March, 28 2012 11:50:00-0700  March, 28 2012 11:50:00-0700
March, 28 2012 11:10:00-0700  March, 28 2012 11:30:00-0700  March, 28 2012 11:50:00-0700
March, 28 2012 11:20:00-0700  March, 28 2012 11:50:00-0700  March, 28 2012 11:50:00-0700

それでは、これを分解してみましょう... 最初の行は個別の ST であるため、その時点までの MAX はその行にあるものです。次の行、ST は一意ではありません。したがって、その時点までのすべての行の MAX は 11:15 ではなく、ST 11:03 の両方の行の 11:50 です。最後の 2 行には 11:50 以降は ET がないため、残りのすべての行についてはそれが表示されます。OVER 句で ORDER BY を使用したので、それを Oracle に指示しました。

于 2012-04-25T17:45:19.337 に答える
2

分析関数に関するOracleのドキュメントには、次のように記載されています。

*If you omit the windowing_clause entirely, then the default is RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.*

RANGEがどのように機能するかを理解していれば、なぜそのような結果が得られるのかが明確になります。

于 2012-04-25T18:31:28.180 に答える