sql >> Databasteknik >  >> RDS >> Sqlserver

Effektivt sätt att få det maximala värdet av en löpande summa i TSQL

SQL Server suger i att beräkna löpande summor.

Här är en lösning för just din fråga (som grupperar efter 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)

Du behöver att ha ett index på TranxDate för att detta ska fungera snabbt.




  1. Hur man skapar PL/SQL svag referensmarkör i Oracle Database

  2. beräkna räkenskapsår i sql select uttalande?

  3. Användaren kan inte se databaser i mysql workbench

  4. Långsam exekvering av fråga i en tom tabell. (efter att ha raderat en stor mängd inlägg)