He estado usando GROUP BY
para todo tipo de consultas agregadas a lo largo de los años. Recientemente, he realizado ingeniería inversa de un código que se usa PARTITION BY
para realizar agregaciones. Al leer toda la documentación que puedo encontrar PARTITION BY
, parece mucho GROUP BY
, ¿quizás con un poco de funcionalidad adicional agregada? ¿Son dos versiones de la misma funcionalidad general, o son algo completamente diferente?
fuente
Podemos tomar un ejemplo simple.
Considere una tabla
TableA
con los siguientes valores:GROUP BY
Sintaxis:
Podemos aplicar
GROUP BY
en nuestra tabla:Resultados:
En nuestra tabla real tenemos 7 filas y cuando aplicamos
GROUP BY id
, el servidor agrupa los resultados en función deid
:En palabras simples:
PARTITION BY
Antes de ir a PARTITION BY, veamos la
OVER
cláusula:Según la definición de MSDN:
PARTITION BY no reducirá el número de filas devueltas.
Podemos aplicar PARTITION BY en nuestra tabla de ejemplo:
Resultado:
Mire los resultados: dividirá las filas y devolverá todas las filas, a diferencia de GROUP BY.
fuente
partition by
puede afectar el número de filas, simplemente no reducirá el número de filas.SELECT
enSELECT DISTINCT
la segunda consulta? ¿No devolvería eso el mismo conjunto de datos que laGROUP BY
consulta? ¿Cuáles son las razones para elegir uno u otro?partition by
en realidad no acumula los datos. Le permite restablecer algo por grupo. Por ejemplo, puede obtener una columna ordinal dentro de un grupo particionando en el campo de agrupación y utilizandorownum()
las filas dentro de ese grupo. Esto le da algo que se comporta un poco como una columna de identidad que se restablece al comienzo de cada grupo.fuente
Encontrado en este enlace: cláusula OVER
fuente
Proporciona datos acumulados sin acumular
es decir, supongamos que quiero devolver la posición relativa de la región de ventas
Con PARTITION BY, puedo devolver el importe de ventas para una región determinada y el importe MAX en todas las regiones de ventas en la misma fila.
Esto significa que tendrá datos repetidos, pero puede ser adecuado para el consumidor final en el sentido de que los datos se han agregado pero no se han perdido datos, como sería el caso con GROUP BY.
fuente
PARTITION BY
es analítico, mientras queGROUP BY
es agregado. Para usarloPARTITION BY
, debe contenerlo con una cláusula OVER .fuente
PARTITION BY is analytic
Esta simple declaración me aclaró mucho. +1.A mi entender, Partition By es casi idéntico a Group By, pero con las siguientes diferencias:
Ese grupo agrupa realmente el conjunto de resultados que devuelve una fila por grupo, lo que da como resultado que SQL Server solo permita en la lista SELECT agregar funciones o columnas que sean parte del grupo por cláusula (en cuyo caso SQL Server puede garantizar que haya un único resultados para cada grupo).
Considere, por ejemplo, MySQL que permite tener en la lista SELECT columnas que no están definidas en la cláusula Group By, en cuyo caso todavía se devuelve una fila por grupo, sin embargo, si la columna no tiene resultados únicos, entonces no hay garantía ¿Cuál será la salida?
Pero con Partition By, aunque los resultados de la función son idénticos a los resultados de una función agregada con Group By, aún se obtiene el conjunto de resultados normal, lo que significa que se obtiene una fila por fila subyacente, y no una fila por grupo, y debido a esto puede tener columnas que no son únicas por grupo en la lista SELECCIONAR.
Como resumen, Group By sería mejor cuando necesita una salida de una fila por grupo, y Partition By sería mejor cuando uno necesita todas las filas pero aún quiere la función de agregado basada en un grupo.
Por supuesto, también puede haber problemas de rendimiento, consulte http://social.msdn.microsoft.com/Forums/ms-MY/transactsql/thread/0b20c2b5-1607-40bc-b7a7-0c60a2a55fba .
fuente
Cuando lo use
GROUP BY
, las filas resultantes serán generalmente menos que las filas entrantes.Pero, cuando lo usa
PARTITION BY
, el recuento de filas resultante debe ser el mismo que el entrante.fuente
Supongamos que tenemos 14 registros de
name
columna en la tablaen
group by
dará cuenta en una sola fila, es decir, 14
pero en
partition by
tendrá 14 filas de aumento en el recuento
fuente
Pequeña observación. El mecanismo de automatización para generar SQL de forma dinámica utilizando la 'partición por' es mucho más simple de implementar en relación con el 'agrupar por'. En el caso de 'agrupar por', debemos cuidar el contenido de la columna 'seleccionar'.
Lo siento por mi ingles.
fuente
Tiene escenarios de uso realmente diferentes. Cuando usa GROUP BY, combina algunos de los registros para las columnas que son iguales y tiene una agregación del conjunto de resultados.
Sin embargo, cuando usa PARTICIÓN POR, su conjunto de resultados es el mismo pero solo tiene una agregación sobre las funciones de la ventana y no combina los registros, todavía tendrá el mismo recuento de registros.
Aquí hay un artículo útil que explica la diferencia: http://alevryustemov.com/sql/sql-partition-by/
fuente
fuente