Oracle分析関数のウィンドウ句の「現在の行」と「前後の0行」に違いはありますか?
質問
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