sql >> Base de Datos >  >> RDS >> Sqlserver

Cláusula TSQL OVER:COUNT(*) OVER (ORDER BY a)

Da un total acumulado (esta funcionalidad no se implementó en SQL Server hasta la versión 2012 .)

El ORDER BY define la ventana que se agregará con UNBOUNDED PRECEDING y CURRENT ROW como predeterminado cuando no se especifica. El valor predeterminado de SQL Server es menos rendimiento RANGE opción en lugar de ROWS .

Tienen diferente semántica en el caso de empates en que la ventana para el RANGE La versión incluye no solo la fila actual (y las filas anteriores), sino también cualquier fila vinculada adicional con el mismo valor de a como la fila actual. Esto se puede ver en el número de filas contadas por cada uno en los resultados a continuación.

SELECT  a, 
        b,
        COUNT(*) OVER (ORDER BY a 
                         ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS  [Rows],
        COUNT(*) OVER (ORDER BY a 
                         RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [Range],
        COUNT(*) OVER() AS [Over()]
    FROM    t;

Devoluciones

a        b        Rows        Range       Over()
-------- -------- ----------- ----------- -----------
NULL     NULL     1           4           12
NULL     NULL     2           4           12
NULL     NULL     3           4           12
NULL     NULL     4           4           12
a        b        5           7           12
a        b        6           7           12
a        b        7           7           12
c        d        8           11          12
c        d        9           11          12
c        d        10          11          12
c        d        11          11          12
e        NULL     12          12          12

Para lograr el resultado que esperaba obtener, omita ambos la PARTITION BY y ORDER BY y usa un OVER() vacío cláusula (también se muestra arriba).