2011-07-27 16 views
7

Estoy escribiendo una consulta para recuperar registros de un almacén de Oracle. Es una simple consulta de selección con combinaciones en pocas tablas y tengo pocas columnas para agregar. Por lo tanto, termino usando Groupby en el resto de las columnas.Grupo por vs Partición por en Oracle

Digamos que estoy escogiendo unas 10 columnas y de las cuales 5 son columnas agregadas. entonces necesito agruparme en las otras 5 columnas. Incluso puedo lograr lo mismo al no hacer un Groupby y usar una cláusula over (paritition by) en cada una de las columnas agregadas que deseo derivar.

No estoy seguro de cuál es mejor contra un almacén o en general.

Respuesta

18

No son lo mismo.

Esto devolverá 3 filas:

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

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

Esto devolverá 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

Estoy tratando de entender. Corrígeme si estoy equivocado. entonces si me distingo de la segunda consulta, obtendré el primer resultado de la consulta. He usado partición solo para hacer ranking() sobre cierta cláusula basada en una columna de partición y obtener el primer rango más o menos. ¿En qué circunstancias el resultado de la segunda consulta será útil? gracias –

+3

Yo diría que si se puede hacer utilizando GROUP BY, es preferible. Las funciones analíticas deben usarse para los casos en los que desee las filas individuales más cierta información agregada, como el ejemplo rank(). –

+0

@Tony ... gracias .. obteniendo una mejor imagen ... –

5

Check this link La principal diferencia entre las funciones de agregación y análisis es que, aunque las funciones analíticas dan resultado agregado no lo hacen agrupe el conjunto de resultados. Devuelven el valor del grupo varias veces con cada registro.

-1

Con PARTITON BY es posible hacer esto en una consulta para obtener diferentes cálculos o agrupar.

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