誰かがpartition by
キーワードの機能を説明し、それを実際に使用する簡単な例と、それを使用したい理由を教えてください。他の人が作成した SQL クエリがあり、その機能を理解しようとしています。
パーティションの例:
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
私がオンラインで見た例は、少し深すぎるようです。
誰かがpartition by
キーワードの機能を説明し、それを実際に使用する簡単な例と、それを使用したい理由を教えてください。他の人が作成した SQL クエリがあり、その機能を理解しようとしています。
パーティションの例:
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
私がオンラインで見た例は、少し深すぎるようです。
このPARTITION BY
句は、句内の各「GROUP」に使用されるレコードの範囲を設定しますOVER
。
あなたの例のSQLでは、DEPT_COUNT
すべての従業員レコードに対してその部門内の従業員数を返します。(テーブルの正規化を解除しているようなものです。テーブルemp
内のすべてのレコードを返しemp
ます。)
emp_no dept_no DEPT_COUNT
1 10 3
2 10 3
3 10 3 <- three because there are three "dept_no = 10" records
4 20 2
5 20 2 <- two because there are two "dept_no = 20" records
別の列 (例: state
) があれば、その州にある部門の数を数えることができます。
これは、結果セットを集約する (つまり、一致するレコードを削除する) ことなくGROUP BY
( SUM
、など)の結果を取得するようなものです。AVG
LAST OVER
または関数を使用して部門内の最低給与と最高給与を取得し、それをサブ選択なしMIN OVER
でこのレコードの給与に対する計算に使用すると便利です。これははるかに高速です。
詳細については、リンクされたAskTo の記事を参照してください。
これは、analytics と呼ばれる SQL 拡張機能です。selectステートメントの「over」は、関数が関数によるグループではなく分析関数であることをオラクルに伝えます。分析を使用する利点は、サブセレクトまたはさらに悪い PL/SQL を使用してデータをループする代わりに、データを 1 回通過するだけで合計、カウント、およびその他の多くの情報を収集できることです。
最初は混乱するように見えますが、これはすぐに第二の性質になります. トム・カイトほどうまく説明できる人はいません。したがって、上記のリンクは素晴らしいです。
もちろん、ドキュメントを読むことは必須です。
EMPNO DEPTNO DEPT_COUNT
7839 10 4
5555 10 4
7934 10 4
7782 10 4 --- 4 records in table for dept 10
7902 20 4
7566 20 4
7876 20 4
7369 20 4 --- 4 records in table for dept 20
7900 30 6
7844 30 6
7654 30 6
7521 30 6
7499 30 6
7698 30 6 --- 6 records in table for dept 30
ここでは、それぞれの部門番号のカウントを取得しています。deptno 10 については、テーブル emp に 4 つのレコードがあり、deptno 20 と 30 についても同様の結果が得られます。