3

これは、別のユーザー(TheSoftwareJedi)の質問に答えるときに出てきました...

次の表を考えます。

ROW_PRIORITY   COL1     COL2    COL3
0              0.1      100     <NULL>
12             <NULL>   <NULL>  3
24             0.2      <NULL>  <NULL>

および次のクエリ:

select  'B' METRIC, ROW_PRIORITY,
        last_value(col1 ignore nulls) over (ORDER BY ROW_PRIORITY) col1,
        last_value(col2 ignore nulls) over (ORDER BY ROW_PRIORITY) col2,
        last_value(col3 ignore nulls) over (ORDER BY ROW_PRIORITY) col3
from    (SELECT * FROM ZTEST);

次の結果が得られます。

METRIC  ROW_PRIORITY    COL1    COL2    COL3
B            0          0.1     100     <NULL>
B           12          0.1     100     3
B           24          0.2     100     3

期待される:

METRIC  ROW_PRIORITY    COL1    COL2    COL3
B            0          0.2     100     3
B           12          0.2     100     3
B           24          0.2     100     3

もちろん問題は、col1 などの行の優先度ごとに 0.2 を取得しないのはなぜですか? LAST_VALUE は、最初に ORDER BY を実行し、次にパーティションから最後の値を選択することになっています。上記のクエリの場合、パーティションはレコードセット全体であるため、上記の予想される結果が表示されます。

誰でも説明できますか?

4

1 に答える 1

5

Partitioning 句に ORDER by を含める場合は、明示的にウィンドウ処理句を含めることができます。

これらの LAST_VALUES をすべての行に配置する場合は、Order By の後にこれを含める必要があります。

無制限の先行と無制限の後続の間の行

これでクエリが修正されるはずです。

ドキュメントからの詳細:

ROW 句または RANGE 句を指定しない場合、ウィンドウ サイズは次のように決定されます。

  • ORDER BY 句が指定されている場合、ウィンドウはパーティションの最初の行 (UNBOUNDED PRECEDING) から始まり、現在の行 (CURRENT ROW) で終わります。
  • ORDER BY 句が指定されていない場合、ウィンドウはパーティションの最初の行から始まり (UNBOUNDED PRECEDING)、パーティションの最後の行で終了します (UNBOUNDED FOLLOWING)。
于 2008-11-04T16:58:33.613 に答える