2011-07-27 17 views
7

Oracleウェアハウスからレコードを取得するためのクエリを作成しています。いくつかのテーブルにジョインしているシンプルなSelect Queryと、集計するカラムがほとんどありません。したがって、残りの列でGroupbyを使用することになります。vsパーティションby by Oracle

私は約10個の列を選んでおり、うち5個は集約列です。だから私は他の5つの列でグループ化する必要があります。私はGroupbyをやっておらず、派生したい各集約列にover(paritition by)節を使っても、同じことを達成することができます。

倉庫または一般的にどちらが良いか分かりません。

答えて

18

これらは同じではありません。

これは3行を返すであろう。

select deptno, count(*) c from emp group by deptno; 

DEPTNO C 
------ - 
10  3 
20  5 
30  6 

これは、14を返します。

select deptno, count(*) over (partition by deptno) c from emp; 


DEPTNO C 
------ - 
10  3 
10  3 
10  3 
20  5 
20  5 
20  5 
20  5 
20  5 
30  6 
30  6 
30  6 
30  6 
30  6 
30  6 
+2

私は理解しようとしています。私が間違っていれば私を訂正してください。私は2番目のクエリのそれが私に最初のクエリの結果を与えることが区別される場合。私は、パーティション列に基づいて特定の句に対してrank()を実行し、最初のランクを取得するためにのみパーティションを使用しました。どのような状況で2番目のクエリ結果が有用でしょうか?ありがとうございます –

+3

私はそれがGROUP BYを使用して行うことができれば、それは好ましいと言います。分析関数は、個々の行にrank()のようないくつかの集約情報を追加する場合に使用する必要があります。 –

+0

@トニー..ありがとうございます。 –

5

Check this link 集計と分析関数との間の主な違いは、分析関数は、集計結果を与えるけれども、彼らがないことです結果セットをグループ化します。各レコードでグループ値を複数回返します。

-1

PARTITON BYとすると、1つのクエリでこれを実行して、異なる計算やグループ化を行うことができます。

select 
    DISTINCT deptno, count(*) over (partition by deptno) c, 
    COUNT(*) OVER (PARTITION BY NULL) AS TOTAL 
from emp;