declare @t table
(
id int,
SomeNumt int
)
insert into @t
select 1,10
union
select 2,12
union
select 3,3
union
select 4,15
union
select 5,23
select * from @t
la selección anterior me devuelve lo siguiente.
id SomeNumt
1 10
2 12
3 3
4 15
5 23
¿Cómo obtengo lo siguiente?
id srome CumSrome
1 10 10
2 12 22
3 3 25
4 15 40
5 23 63
Respuestas:
Ejemplo de SQL Fiddle
Salida
Editar: esta es una solución generalizada que funcionará en la mayoría de las plataformas db. Cuando haya una mejor solución disponible para su plataforma específica (por ejemplo, la de Gareth), ¡úsela!
fuente
La última versión de SQL Server (2012) permite lo siguiente.
o
Esto es aún más rápido. La versión particionada se completa en 34 segundos en más de 5 millones de filas para mí.
Gracias a Peso, quien comentó sobre el hilo del Equipo SQL mencionado en otra respuesta.
fuente
ROWS UNBOUNDED PRECEDING
lugar deROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
.SUM(COUNT(*)) OVER (ORDER BY RowId ROWS UNBOUNDED PRECEDING) AS CumulativeSum
. No era obvio para mí si funcionaría, pero funcionó :-)Para SQL Server 2012 en adelante, podría ser fácil:
porque la
ORDER BY
cláusula paraSUM
por defecto significaRANGE UNBOUNDED PRECEDING AND CURRENT ROW
para el marco de la ventana ("Observaciones generales" en https://msdn.microsoft.com/en-us/library/ms189461.aspx )fuente
Una versión CTE, solo por diversión:
Devoluciones:
fuente
Primero creemos una tabla con datos ficticios ->
aquí me estoy uniendo a la misma mesa (SELF Joining)
RESULTADO:
aquí vamos ahora solo sumamos el Somevalue de t2 y obtendremos el ans
Resultado deseado
Despeja la mesa ficticia
fuente
rank()
y otra orden por cláusula para resolverlo.Respuesta tardía pero mostrando una posibilidad más ...
La generación de suma acumulativa puede optimizarse más con la
CROSS APPLY
lógica.Funciona mejor que
INNER JOIN
&OVER Clause
cuando se analiza el plan de consulta real ...fuente
set io statistics on
y compara la CPU y los tiempos reales.Select *, (Select SUM(SOMENUMT) From @t S Where S.id <= M.id) From @t M
fuente
correlated subquery
para cada fila del conjunto de resultados, escaneando más y más filas a medida que avanza. No mantiene un total acumulado y escanea los datos una vez como pueden hacerlo las funciones de ventana.Hay una implementación CTE mucho más rápida disponible en esta excelente publicación: http://weblogs.sqlteam.com/mladenp/archive/2009/07/28/SQL-Server-2005-Fast-Running-Totals.aspx
El problema en este hilo se puede expresar así:
fuente
Puede usar esta consulta simple para el cálculo progresivo:
fuente
Una vez que se crea la tabla,
fuente
Arriba (Pre-SQL12) vemos ejemplos como este:
Más eficiente...
fuente
Prueba esto
fuente
Prueba esto:
fuente
La solución SQL que combina "FILAS ENTRE PRECEDENTES SIN BORDE Y FILA ACTUAL" y "SUMA" hizo exactamente lo que quería lograr. Muchas gracias!
Si puede ayudar a alguien, aquí estaba mi caso. Quería acumular +1 en una columna cada vez que se encuentra un creador como "Some Maker" (ejemplo). Si no, no hay incremento pero muestra el resultado del incremento anterior.
Entonces esta pieza de SQL:
Me permitió obtener algo como esto:
Explicación de lo anterior: comienza el conteo de "algún creador" con 0, se encuentra Some Maker y hacemos +1. Para el Usuario 1, se encuentra MakerC, por lo que no hacemos +1, sino que el recuento vertical de Some Maker está pegado a 2 hasta la siguiente fila. La partición es por usuario, por lo que cuando cambiamos de usuario, el recuento acumulativo vuelve a cero.
Estoy en el trabajo, no quiero ningún mérito en esta respuesta, solo agradezco y muestre mi ejemplo en caso de que alguien esté en la misma situación. Estaba tratando de combinar SUMA y PARTICIÓN, pero la increíble sintaxis "FILAS ENTRE LAS PREDAS SIN PREDEDOR Y LA FILA ACTUAL" completó la tarea.
¡Gracias! Groaker
fuente
Sin utilizar ningún tipo de salario acumulativo de JOIN para una persona mediante el uso de la siguiente consulta:
fuente
Por ejemplo: SI tiene una tabla con dos columnas, una es ID y la segunda es número y quiere saber la suma acumulativa.
fuente