sql >> Database >  >> RDS >> Sqlserver

Performante manier om de maximale waarde van een lopend totaal in TSQL te krijgen

SQL Server zuigt in het berekenen van lopende totalen.

Hier is een oplossing voor uw vraag (welke groepeert op datum):

WITH    q AS
        (
        SELECT  TranxDate, SUM(TranxAmt) AS TranxSum
        FROM    t_transaction
        GROUP BY
                TranxDate
        ),
        m (TranxDate, TranxSum) AS
        (
        SELECT  MIN(TranxDate), SUM(TranxAmt)
        FROM    (
                SELECT  TOP 1 WITH TIES *
                FROM    t_transaction
                ORDER BY
                        TranxDate
                ) q
        UNION ALL
        SELECT  DATEADD(day, 1, m.TranxDate),
                m.TranxSum + q.TranxSum
        FROM    m
        CROSS APPLY
                (
                SELECT  TranxSum
                FROM    q
                WHERE   q.TranxDate = DATEADD(day, 1, m.TranxDate) 
                ) q
        WHERE   m.TranxDate <= GETDATE()
        )
SELECT  TOP 1 *
FROM    m
ORDER BY
        TranxSum DESC
OPTION (MAXRECURSION 0)

Je nodig om een ​​index te hebben op TranxDate om dit snel te laten werken.




  1. Verwijder trailing :teken uit een rij in een SQL-tabel

  2. PL/SQL:hoe vraag ik gebruikersinvoer in een procedure?

  3. Hoe PL/pgSQL-functies uitsluiten in export?

  4. Is het mogelijk om een ​​kolom te maken met een UNIX_TIMESTAMP standaard in MySQL?