Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

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


Ele fornece um total em execução (essa funcionalidade não foi implementada no SQL Server até a versão 2012 .)

O ORDER BY define a janela a ser agregada com UNBOUNDED PRECEDING e CURRENT ROW como o padrão quando não especificado. O padrão do SQL Server é o menos desempenho RANGE opção em vez de ROWS .

Eles têm semânticas diferentes no caso de empates em que a janela para o RANGE version inclui não apenas a linha atual (e as linhas anteriores), mas também todas as linhas vinculadas adicionais com o mesmo valor de a como a linha atual. Isso pode ser visto no número de linhas contadas por cada um nos resultados abaixo.
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;

Devoluções
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 alcançar o resultado que você esperava, omita ambos a PARTITION BY e ORDER BY e use um OVER() vazio cláusula (também mostrada acima).