Oracle分析関数のウィンドウ句の「現在の行」と「前後の0行」に違いはありますか?

StackOverflow https://stackoverflow.com/questions/379643

  •  22-08-2019
  •  | 
  •  

質問

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 行」と異なる例やドキュメントを提供できる人はいますか?私には単なる糖衣構文のように思えます...

役に立ちましたか?

解決

本当にあなたが使用している問題ではありません。彼らは、ウィンドウを表現する2つの異なる方法ですが、オプティマイザは、クエリを同じ方法で実行します。用語「現在の行は、」分析関数だけでなく、オラクルで複数のデータベースに共通するものです。これは、一部の人々は、カウント(1)上のカウント(*)を好むのと同じように、文体の違いの多くはでています。

他のヒント

私が手元にある Oracle のドキュメント (Oracle 9.2) には次のように書かれています。

RANGE を指定した場合:

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

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

これは、すべてあなたが達成しようとしているものについてです。 あなたはそれがサブセット内のサブセットまたは比較物事内LAST_VALUEを見つけるために使用BETWEEN ROWS / RANGE BETWEENを使用することもできます。しかし、最も確かに、あなたが提供たとえば必要はありません。

    select deptno, 
       empno,
       hiredate,
       count(*) over (partition by deptno, trunc(hiredate,'mm')) cnt_same_month
  from emp
 where deptno = 30
 order by deptno, hiredate
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top