sql >> Databáze >  >> RDS >> Sqlserver

Klauzule TSQL OVER:COUNT(*) OVER (ORDER BY a)

Udává průběžný součet (tato funkce nebyla implementována v SQL Serveru do verze 2012 .)

ORDER BY definuje okno, které má být agregováno pomocí UNBOUNDED PRECEDING a CURRENT ROW jako výchozí, pokud není uvedeno. SQL Server je ve výchozím nastavení méně výkonný RANGE možnost namísto ROWS .

Mají odlišnou sémantiku v případě remíz v okně pro RANGE verze obsahuje nejen aktuální řádek (a předchozí řádky), ale také všechny další svázané řádky se stejnou hodnotou a jako aktuální řádek. To lze vidět na počtu řádků, které každý započítá ve výsledcích níže.

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;

Vrátí

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

Chcete-li dosáhnout výsledku, který jste očekávali, vynechejte obojí PARTITION BY a ORDER BY a použijte prázdné OVER() klauzule (také zobrazena výše).



  1. Základy tabulkových výrazů, Část 11 – Pohledy, úvahy o úpravách

  2. Úvod do zabezpečení na úrovni řádků v SQL Server

  3. Neznámý sloupec v chybě 'seznam polí' v dotazu aktualizace MySQL

  4. Datový model organizace svatby