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

Lead() и LAG() функционалност в SQL Server 2008

Вие сте на прав път, като присъедините масата към себе си. Включих 2 метода за това по-долу, които трябва да работят добре тук. Първият трик е във вашия ROW_NUMBER , не забравяйте да разделите по потребителския идентификатор и да сортирате по дата. След това можете да използвате или INNER JOIN с агрегиране или CROSS APPLY за да съставите текущите си общи суми.

Настройване на данните с разделения ROW_NUMBER() :

DECLARE @Data TABLE (
    RowNum INT,
    UserId INT,
    Date DATE,
    Miles INT
)
INSERT @Data 
    SELECT
        ROW_NUMBER() OVER (PARTITION BY UserId
            ORDER BY Date) AS RowNum,
        *
    FROM (
        SELECT 1, '2015-01-01', 5
        UNION ALL SELECT 1, '2015-01-02', 6
        UNION ALL SELECT 2, '2015-01-01', 7
        UNION ALL SELECT 2, '2015-01-02', 3
        UNION ALL SELECT 2, '2015-01-03', 2
        ) T (UserId, Date, Miles)

Използвайте INNER JOIN с агрегацията

SELECT
    D1.UserId,
    D1.Date,
    D1.Miles,
    SUM(D2.Miles) AS [Total]
FROM @Data D1
    INNER JOIN @Data D2
        ON D1.UserId = D2.UserId
            AND D2.RowNum <= D1.RowNum
GROUP BY
    D1.UserId,
    D1.Date,
    D1.Miles

Използвайте CROSS APPLY за обща сумата

SELECT
    UserId,
    Date,
    Miles,
    Total
FROM @Data D1
    CROSS APPLY (
        SELECT SUM(Miles) AS Total
        FROM @Data
        WHERE UserId = D1.UserId
            AND RowNum <= D1.RowNum
    ) RunningTotal

Резултатът е един и същ за всеки метод:

UserId      Date       Miles       Total
----------- ---------- ----------- -----------
1           2015-01-01 5           5
1           2015-01-02 6           11
2           2015-01-01 7           7
2           2015-01-02 3           10
2           2015-01-03 2           12



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземете размер за съхранение на таблица и индекс в sql сървър

  2. Миграция от Sql 2008 Developer към Sql Azure

  3. Linux - PHP 7.0 и MSSQL (Microsoft SQL)

  4. SQL Server 2008:INSERT, ако не излиза, поддържайте уникална колона

  5. SQL, избор между дата/час