sql >> Databasteknik >  >> RDS >> Sqlserver

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

Det ger en löpande summa (denna funktionalitet implementerades inte i SQL Server förrän version 2012 .)

ORDER BY definierar fönstret som ska aggregeras med UNBOUNDED PRECEDING och CURRENT ROW som standard när det inte anges. SQL Server har som standard den sämre presterande RANGE alternativ istället för ROWS .

De har olika semantik när det gäller kopplingar genom att fönstret för RANGE versionen inkluderar inte bara den aktuella raden (och föregående rader) utan även alla ytterligare kopplade rader med samma värde på a som aktuell rad. Detta kan ses i antalet rader som räknas av var och en i resultaten nedan.

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;

Retur

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

För att uppnå det resultat som du förväntade dig att få, utelämna båda PARTITION BY och ORDER BY och använd en tom OVER() klausul (visas även ovan).



  1. ta bort dubbletter av rader baserat på ett kolumnvärde

  2. Grails transaktion setSavePoint-metoden på mysql orsakar undantag

  3. PLS-00394:Fel antal värden i INTO-listan för en fetch-sats

  4. Återställ en databas i SQL Server 2017