Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wydajny sposób na uzyskanie maksymalnej wartości sumy bieżącej w TSQL

SQL Server jest do bani w obliczaniu bieżących sum.

Oto rozwiązanie dla Twojego zapytania (które grupuje według 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)

potrzebujesz mieć indeks na TranxDate aby to działało szybko.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego konwersja z DATETIME na DATETIME2 wydaje się zmieniać wartość?

  2. Zastosowanie funkcji agregującej MIN do pola BIT

  3. Używanie IF EXISTS z CTE

  4. Dodaj przesunięcie strefy czasowej do wartości datetime2 w programie SQL Server (T-SQL)

  5. PHP + SQL Server - Jak ustawić zestaw znaków do połączenia?