He estado usando GROUP BY
para todo tipo de consultas agregadas a lo largo de los años. Recientemente, he estado realizando ingeniería inversa en algunos códigos que usan PARTITION BY
para realizar agregaciones. Al leer toda la documentación que puedo encontrar sobre PARTITION BY
, suena muy parecido a GROUP BY
, ¿tal vez con un poco de funcionalidad extra agregada? ¿Son dos versiones de la misma funcionalidad general, o son algo completamente diferente?SQL Server: Diferencia entre PARTITION BY y GROUP BY
Respuesta
Se utilizan en diferentes lugares. group by
modifica toda la consulta, como:
select customerId, count(*) as orderCount
from Orders
group by customerId
Pero partition by
solo funciona en a window function, como row_number
:
select row_number() over (partition by customerId order by orderId)
as OrderNumberForThisCustomer
from Orders
Un group by
normalmente reduce el número de filas devueltas por rodar hacia arriba y el cálculo de promedios o sumas por cada fila. partition by
no afecta el número de filas devueltas, pero cambia la forma en que se calcula el resultado de una función de ventana.
partition by
en realidad no se acumulan los datos. Le permite restablecer algo por grupo. Por ejemplo, puede obtener una columna ordinal dentro de un grupo dividiendo en el campo de agrupamiento y usando rownum()
sobre las filas dentro de ese grupo. Esto le da algo que se comporta como una columna de identidad que se restablece al comienzo de cada grupo.
PARTITION BY
es analítico, mientras que GROUP BY
es un agregado. Para usar PARTITION BY
, debe contenerlo con un OVER clause.
'PARTITION BY es analítico' Esta simple afirmación despejó mucho para mí. +1. –
PARTICIÓN POR Divide el conjunto de resultados en particiones. La función de ventana se aplica a cada partición por separado y el cómputo se reinicia para cada partición.
encontrado en este enlace: OVER Clause
Proporciona datos enrolladas sin rodar hasta
es decir Supongamos que quiero para devolver la posición relativa de la zona de venta
Usando mediante reparto, I puede 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 convenir al consumidor final en el sentido de que los datos se han agregado pero no se han perdido datos, como sería el caso de GROUP BY.
La mejor y más simple respuesta. – tmthyjames
A partir de mi entendimiento partición es casi idéntico al Grupo A, pero con las siguientes diferencias:
ese grupo en realidad grupos del conjunto de resultados devolver una fila por cada grupo, que por lo tanto resulta en SQL Server sólo permite en las funciones o columnas agregadas de la lista SELECT que forman parte de la cláusula group by (en cuyo caso SQL Server puede garantizar que haya resultados únicos para cada grupo).
Considere por ejemplo MySQL que permite tener en la lista SELECCIONAR columnas que no están definidas en la cláusula Agrupar por, 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 de 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 Agrupar por, aún obtendrá el conjunto de resultados normal, lo que significa que uno obtiene una fila por fila subyacente, y no una fila por grupo, y debido a esto uno puede tener columnas que no son únicas por grupo en la lista SELECCIONAR.
Por lo tanto, como resumen, Agrupar por sería mejor cuando se necesita una salida de una fila por grupo, y la Partición por sería mejor cuando se necesitan todas las filas pero aún se desea 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.
podemos tomar un ejemplo sencillo
tenemos una tabla llamada TableA
con los siguientes valores.
id firstname lastname Mark
-------------------------------------------------------------------
1 arun prasanth 40
2 ann antony 45
3 sruthy abc 41
6 new abc 47
1 arun prasanth 45
1 arun prasanth 49
2 ann antony 49
Grupo Por
El grupo de SQL BY se puede utilizar en una instrucción SELECT para recoger de datos a través de múltiples registros y agrupar los resultados por uno o más columnas.
En palabras más simples, la instrucción GROUP BY se usa junto con las funciones agregadas para agrupar el conjunto de resultados por una o más columnas .
sintaxis:
SELECT expression1, expression2, ... expression_n,
aggregate_function (aggregate_expression)
FROM tables
WHERE conditions
GROUP BY expression1, expression2, ... expression_n;
Podemos aplicar GroupBy en nuestra mesa
select SUM(Mark)marksum,firstname from TableA
group by id,firstName
Resultados:
marksum firstname
----------------
94 ann
134 arun
47 new
41 sruthy
En nuestra mesa real que tenemos 7 filas y cuando aplicamos grupo por id , El grupo de servidores basados en los resultados de Identificación del
En palabras sencillas
aquí por grupo normalmente reduce el número de filas devueltas por rodar para arriba y el cálculo de la suma de cada fila.
partición por
antes de ir a la partición por
veamos cláusula OVER
Según MSDN definición
SOBRE cláusula define una ventana o conjunto de filas especificado por el usuario wi adelgazar un conjunto de resultados de consulta . Una función de ventana luego calcula un valor para cada fila en la ventana. Puede usar la cláusula OVER con funciones para calcular valores agregados, como promedios móviles, agregados acumulados, totales acumulados , o una N superior por resultados de grupo.
partición no reducirá el número de filas devueltas
podemos aplicar partición en nuestra tabla de ejemplo
select SUM(Mark) OVER (PARTITION BY id) AS marksum, firstname from TableA
resultado:
marksum firstname
-------------------
134 arun
134 arun
134 arun
94 ann
94 ann
41 sruthy
47 new
vistazo a la resultados dividirá las filas y dará como resultado todas las filas no como grupo.
-- BELOW IS A SAMPLE WHICH OUTLINES THE SIMPLE DIFFERENCES
-- READ IT AND THEN EXECUTE IT
-- THERE ARE THREE ROWS OF EACH COLOR INSERTED INTO THE TABLE
-- CREATE A database called testDB
-- use testDB
USE [TestDB]
GO
-- create Paints table
CREATE TABLE [dbo].[Paints](
[Color] [varchar](50) NULL,
[glossLevel] [varchar](50) NULL
) ON [PRIMARY]
GO
-- Populate Table
insert into paints (color, glossLevel)
select 'red', 'eggshell'
union
select 'red', 'glossy'
union
select 'red', 'flat'
union
select 'blue', 'eggshell'
union
select 'blue', 'glossy'
union
select 'blue', 'flat'
union
select 'orange', 'glossy'
union
select 'orange', 'flat'
union
select 'orange', 'eggshell'
union
select 'green', 'eggshell'
union
select 'green', 'glossy'
union
select 'green', 'flat'
union
select 'black', 'eggshell'
union
select 'black', 'glossy'
union
select 'black', 'flat'
union
select 'purple', 'eggshell'
union
select 'purple', 'glossy'
union
select 'purple', 'flat'
union
select 'salmon', 'eggshell'
union
select 'salmon', 'glossy'
union
select 'salmon', 'flat'
/* COMPARE 'GROUP BY' color to 'OVER (PARTITION BY Color)' */
-- GROUP BY Color
-- row quantity defined by group by
-- aggregate (count(*)) defined by group by
select count(*) from paints
group by color
-- OVER (PARTITION BY... Color
-- row quantity defined by main query
-- aggregate defined by OVER-PARTITION BY
select color
, glossLevel
, count(*) OVER (Partition by color)
from paints
/* COMPARE 'GROUP BY' color, glossLevel to 'OVER (PARTITION BY Color, GlossLevel)' */
-- GROUP BY Color, GlossLevel
-- row quantity defined by GROUP BY
-- aggregate (count(*)) defined by GROUP BY
select count(*) from paints
group by color, glossLevel
-- Partition by Color, GlossLevel
-- row quantity defined by main query
-- aggregate (count(*)) defined by OVER-PARTITION BY
select color
, glossLevel
, count(*) OVER (Partition by color, glossLevel)
from paints
Supongamos que tenemos 14 registros de name
columna de la Tabla
en group by
select name,count(*) as totalcount from person where name='Please fill out' group BY name;
se dará cuenta de en una sola fila, es decir 14
pero en partition by
select row_number() over (partition by name) as total from person where name = 'Please fill out';
14 filas de aumento en el recuento
Pequeña observación. Mecanismo de automatización para generar SQL de forma dinámica utilizando la 'partición por' es mucho más fácil de implementar en relación con el 'grupo por'. En el caso de 'group by', debemos ocuparnos del contenido de la columna 'select'.
Lo siento por mi inglés.
- 1. SQL "GROUP BY" problema
- 2. ¿cuál es la diferencia entre GROUP BY y ORDER BY en sql
- 3. SQL Group By Date Conflicts
- 4. CakePHP y GROUP BY
- 5. Linq to SQL Group By y Suma
- 6. T-SQL: El uso de una y PARTITION BY
- 7. GROUP BY en MATLAB
- 8. Limitaciones de GROUP BY
- 9. MySQL Group By y HAVING
- 10. Conde SQL (*) y el Grupo By - Encuentra diferencia entre filas
- 11. GROUP BY con CursorLoader
- 12. Cómo combinar GROUP BY, ORDER BY y HABER
- 13. El uso de ORDER BY y GROUP BY junto
- 14. SQL GROUP BY con "valores por defecto"
- 15. MySQL Group By Hours
- 16. ¿Cómo funciona GROUP BY?
- 17. Group (By) in Mongoose?
- 18. SQL GROUP BY: intervalos en continuidad?
- 19. GROUP BY/función agregada confusión en SQL
- 20. Usando GROUP BY en JPA
- 21. ¿Cómo combinar GROUP BY y ROW_NUMBER?
- 22. MySQL - utilizando GROUP BY y DESC
- 23. Diferencia entre pass-by-reference & y *?
- 24. GROUP BY con aggregate y INNER JOIN
- 25. Cómo hacer una distinción entre mayúsculas y minúsculas GROUP BY?
- 26. SQL: utilizando GROUP BY y MAX en varias columnas
- 27. Usando group by en dos campos y cuente en SQL
- 28. GROUP BY/SUM de Shell
- 29. Colmena: SELECT AS y GROUP BY
- 30. MySQL Group by ID y Latest Datetime
nice answer, ¿podría escribir una muestra de los resultados devueltos para cada uno de ellos? –
@AshkanMobayenKhiabani puede ejecutar ambas consultas en contra de Northwind, que pueden o no estar instaladas por defecto dependiendo de su versión de servidor sql. Si no, puede buscarlo en la página de descargas. –
@AshkanMobayenKhiabani La respuesta de Arunprasanth a continuación muestra resultados devueltos que pueden ahorrarle tiempo en lugar de pasar por más aros de aprendizaje y tiempo para aprender Northwind – Praxiteles