Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Ефективен начин за получаване на максималната стойност на текущия сбор в TSQL

SQL Server гадно е изчисляването на текущи суми.

Ето решение за самото ви запитване (което се групира по дати):

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)

Вие имате нужда да има индекс на TranxDate за да работи бързо.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Най-добрият еквивалент на IsInteger в SQL Server

  2. Използвайте SMO, за да промените местоположенията по подразбиране на базата данни на SQL Server

  3. Sql Server 2008 - FullText закръгляващи парични стойности?

  4. Изберете последните 30 дни с sql заявка

  5. System.Data.SqlTypes.SqlTypeException:препълване на SqlDateTime