Представьте следующую таблицу (называемую TestTable
):
id somedate somevalue
-- -------- ---------
45 01/Jan/09 3
23 08/Jan/09 5
12 02/Feb/09 0
77 14/Feb/09 7
39 20/Feb/09 34
33 02/Mar/09 6
Мне нужен запрос, который возвращает текущее общее количество в порядке даты, например:
id somedate somevalue runningtotal
-- -------- --------- ------------
45 01/Jan/09 3 3
23 08/Jan/09 5 8
12 02/Feb/09 0 8
77 14/Feb/09 7 15
39 20/Feb/09 34 49
33 02/Mar/09 6 55
Я знаю, что различные способы выполнения этого в SQL Server 2000/2005/2008.
Мне особенно интересен такой метод, который использует трюк агрегирующего набора:
INSERT INTO @AnotherTbl(id, somedate, somevalue, runningtotal)
SELECT id, somedate, somevalue, null
FROM TestTable
ORDER BY somedate
DECLARE @RunningTotal int
SET @RunningTotal = 0
UPDATE @AnotherTbl
SET @RunningTotal = runningtotal = @RunningTotal + somevalue
FROM @AnotherTbl
... это очень эффективно, но я слышал, что есть проблемы вокруг этого, потому что вы не можете гарантировать, что оператор UPDATE
будет обрабатывать строки в правильном порядке. Возможно, мы сможем получить некоторые окончательные ответы на эту проблему.
Но, может быть, есть другие способы, которые могут предложить люди?
edit: Теперь с SqlFiddle с настройкой и примером "трюк обновления" выше