Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Chức năng Lead () và LAG () trong SQL Server 2008

Bạn đang đi đúng hướng bằng cách tham gia bảng với chính nó. Tôi đã bao gồm 2 phương pháp thực hiện việc này dưới đây sẽ hoạt động tốt ở đây. Bí quyết đầu tiên là trong ROW_NUMBER của bạn , hãy đảm bảo phân vùng theo id người dùng và sắp xếp theo ngày. Sau đó, bạn có thể sử dụng INNER JOIN với sự tổng hợp hoặc CROSS APPLY để xây dựng tổng số đang chạy của bạn.

Thiết lập dữ liệu với ROW_NUMBER() được phân vùng :

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)

Sử dụng INNER JOIN với Tổng hợp

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

Sử dụng CROSS APPLY cho tổng số đang chạy

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

Đầu ra giống nhau cho mỗi phương pháp:

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. MS SQL 2008 - lấy tất cả các tên bảng và số hàng của chúng trong một DB

  2. Lỗi SQL:Cú pháp không chính xác gần từ khóa 'Người dùng'

  3. Phiên bản SQL Server 2008

  4. Cách thay thế một chuỗi nếu bản ghi là NULL trong T-SQL

  5. Có cách nào để chỉ định tên bảng dưới dạng một chuỗi không?