2

一部の Oracle の分析関数では、「無制限の先行/後続」、「現在の行」、または「value_expr先行/後続」などのキーワードを使用して、ウィンドウ句で現在のパーティションのサブセットを指定できます。ここで、value_expr は物理的または論理的なオフセットです。現在の行または値 (それぞれ ROW または RANGE を指定したかどうかによって異なります)。

次の例では、scott/tiger を使用して、部門 30 の従業員と、その部門の前に雇用された従業員数 (自分自身を含む) を表示しています。

select deptno, 
       empno,
       hiredate,
       count(*) over (partition by deptno 
                          order by hiredate
                          range between unbounded preceding and current row) cnt_hired_before1,
       count(*) over (partition by deptno 
                          order by hiredate
                          range between unbounded preceding and 0 preceding) cnt_hired_before2
  from emp
 where deptno = 30
 order by deptno, hiredate;

...「現在の行」が「0 先行/後続」と異なる例またはドキュメントを提供できる人はいますか? それは私には構文糖のように思えます...

4

3 に答える 3

2

どちらを使用しても問題ありません。これらはウィンドウ処理を表現する 2 つの異なる方法ですが、オプティマイザは同じ方法でクエリを実行します。「現在行」という用語は、Oracle に限らず、分析機能を持つ複数のデータベースに共通する用語です。一部の人々が count(1) よりも count(*) を好むのと同じように、これはスタイル上の違いです。

于 2008-12-29T21:46:20.317 に答える
1

私が渡さなければならないOracleのドキュメント(Oracle 9.2)には次のように書かれています。

RANGEを指定した場合:

  • value_exprは論理オフセットです。正の数値または間隔リテラルに評価される定数または式である必要があります。

これは、0は正の数値ではないため、実際には0を使用すべきではないことを意味します。しかし、あなたがそうであるので、明らかに前後に0を使用することは可能です。

于 2008-12-19T16:52:17.640 に答える
-1

それはすべて、あなたが達成しようとしていることです。RANGE BETWEEN/ROWS BETWEEN を使用して、サブセット内の LAST_VALUE を検索したり、サブセット内のものを比較したりすることができます。しかし、あなたが提供した例は必要ありません。

    select deptno, 
       empno,
       hiredate,
       count(*) over (partition by deptno, trunc(hiredate,'mm')) cnt_same_month
  from emp
 where deptno = 30
 order by deptno, hiredate
于 2008-12-18T23:16:29.367 に答える