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

Funkcje Lead() i LAG() w SQL Server 2008

Jesteś na dobrej drodze, dołączając się do stołu. Poniżej wymieniłem 2 metody wykonania tego, które powinny tutaj działać dobrze. Pierwsza sztuczka jest w Twoim ROW_NUMBER , pamiętaj, aby podzielić według identyfikatora użytkownika i posortować według daty. Następnie możesz użyć INNER JOIN z agregacją lub CROSS APPLY do tworzenia sum biegowych.

Konfigurowanie danych za pomocą partycjonowanej 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)

Użyj INNER JOIN z agregacją

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

Użyj CROSS APPLY za bieżącą sumę

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

Wyjście jest takie samo dla każdej metody:

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. Jak znaleźć granice grup ciągłych liczb sekwencyjnych?

  2. Msg 4834 Nie masz uprawnień do korzystania z instrukcji ładowania zbiorczego

  3. Jak utworzyć unikalne ograniczenie na kolumnie dla już istniejącej tabeli — samouczek SQL Server / TSQL część 97

  4. Przykład prostej instrukcji scalania w SQL Server

  5. Różnica między użytkownikiem a loginem w SQL Server