sql >> Database >  >> RDS >> Sqlserver

TSQL OVER-clausule:COUNT(*) OVER (ORDER BY a)

Het geeft een lopend totaal (deze functionaliteit is niet geïmplementeerd in SQL Server tot versie 2012 .)

De ORDER BY definieert het venster dat moet worden samengevoegd met UNBOUNDED PRECEDING en CURRENT ROW als standaard indien niet gespecificeerd. SQL Server is standaard ingesteld op de minder goed presterende RANGE optie in plaats van ROWS .

Ze hebben verschillende semantiek in het geval van stropdassen doordat het venster voor de RANGE versie bevat niet alleen de huidige rij (en voorgaande rijen) maar ook eventuele extra gebonden rijen met dezelfde waarde van a als de huidige rij. Dit is te zien aan het aantal rijen dat door elk is geteld in de onderstaande resultaten.

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;

Retourneren

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

Om het resultaat te bereiken dat u verwachtte, laat u beide . weg de PARTITION BY en ORDER BY en gebruik een lege OVER() clausule (ook hierboven weergegeven).



  1. Algemene datumnotatiefunctie voor Oracle-sql en Mysql

  2. django connec mysql --_mysql_exceptions.OperationalError:(2006, <NULL>)

  3. Direct uitvoeren met niet-Sql-type

  4. string splitsen in meerdere rijen