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

Výkonný způsob, jak získat maximální hodnotu průběžného součtu v TSQL

SQL Server naštve výpočet průběžných součtů.

Zde je řešení pro váš samotný dotaz (který seskupuje podle dat):

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)

potřebujete mít index na TranxDate aby to fungovalo rychle.




  1. mysql seskupení podle týdne

  2. 1318 - Nesprávný počet argumentů pro PROCEDURE

  3. Jak reprezentovat kategorizovaný databázový vztah many-to-many, kde jsou kategorie specifické pro jednu stranu vztahu

  4. Proč uložené procedury stále nejsou podporovány v Rails (3+)?