278

誰かがpartition byキーワードの機能を説明し、それを実際に使用する簡単な例と、それを使用したい理由を教えてください。他の人が作成した SQL クエリがあり、その機能を理解しようとしています。

パーティションの例:

SELECT empno, deptno, COUNT(*) 
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp

私がオンラインで見た例は、少し深すぎるようです。

4

6 に答える 6

283

この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 の記事を参照してください。

于 2009-02-18T16:42:47.150 に答える
29

これは、analytics と呼ばれる SQL 拡張機能です。selectステートメントの「over」は、関数が関数によるグループではなく分析関数であることをオラクルに伝えます。分析を使用する利点は、サブセレクトまたはさらに悪い PL/SQL を使用してデータをループする代わりに、データを 1 回通過するだけで合計、カウント、およびその他の多くの情報を収集できることです。

最初は混乱するように見えますが、これはすぐに第二の性質になります. トム・カイトほどうまく説明できる人はいません。したがって、上記のリンクは素晴らしいです。

もちろん、ドキュメントを読むことは必須です。

于 2009-02-27T04:47:56.063 に答える
8
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 についても同様の結果が得られます。

于 2009-08-25T06:45:14.750 に答える