आप टेबल को खुद से जोड़कर सही रास्ते पर हैं। मैंने इसे नीचे करने के 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