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