Вычислить предыдущее значение в T-SQL (обновление)

Я немного борюсь, если не сказать, сильно с некоторой логикой SQL.

Пример набора данных

wid  CCVnr  Amount  Reference  Seq  Month      ColumIwant=PreviousAmount
11   15946  20      50         1    1/1/2013   NULL
12   15946  20      50         2    1/2/2013   NULL
13   15946  20      50         3    1/3/2013   NULL
14   15946  20      50         4    1/4/2013   NULL
15   15946  20      50         5    1/5/2013   NULL
16   15946  20      50         6    1/6/2013   NULL
35   15946  20      50         1    1/1/2013   NULL
36   15946  10      50         2    1/2/2013   20
37   15946  10      50         3    1/3/2013   20
38   15946  10      50         4    1/4/2013   20
39   15946  10      50         5    1/5/2013   20
40   15946  10      50         6    1/6/2013   20
88   15946  10      50         1    1/1/2013   20
89   15946  20      50         2    1/2/2013   NULL
90   15946  25      50         3    1/3/2013   10
91   15946  25      50         4    1/4/2013   10
92   15946  25      50         5    1/5/2013   10
93   15946  25      50         6    1/6/2013   10

5 первых столбцов, которые у меня есть, я хочу «вычислить» в последнем столбце: PreviousAmount. Проблема для меня в том, что каждый раз, когда все 6 месяцев (пере) загружаются, недостаточно посмотреть на «измененное» значение, вы также должны учитывать историю.
(Сначала у меня был фрагмент кода с CTE, сравнивающим одну строку с другой, но я пропускаю историю...)

Ситуация здесь такая: у клиента есть сумма, которую он хочет платить в месяц, которую он может изменить: в этом случае он меняет ее с 20 на 10 и на 25.

Я загрузил CSV-файл или сам набор данных, с которым работаю, здесь: https://mega.co.nz/#!oZhC0RxB!CzzMx3Yr6Kx1_1N9scuNqwJnqoZDGUXte47iOPkLG-E

Мы используем SQL Server 2008 R2. Таких строк в таблице 20 миллионов. Так что, возможно, курсор не лучший вариант (?)

Заранее большое спасибо за любую помощь!! л


ОБНОВЛЕНИЕ: я добавил столбец wid, потому что исходный набор данных также содержит столбец wid. @Марк Баннистер Логика заключается в том, чтобы посмотреть на «Сумму» и когда за определенный месяц Сумма изменяется пользователем: * Все следующие месяцы обновляются, когда «Новая сумма» * Мы вычисляем Предыдущая сумма = сумма, которая была до

@Love2Learn также спасибо за ваш комментарий. Есть намного больше столбцов, но вы должны знать, что добавить больше столбцов в блок кода stackoverflow непросто. Поэтому я также загрузил файл CSV, в котором вы можете найти ссылку. Соответствующий столбец, который я добавил, — это «wid».

Обычно должно быть достаточно информации и столбцов для вычисления этой предыдущей строки. Заранее спасибо!


person laurens    schedule 04.04.2013    source источник
comment
Какова логика определения того, какая строка содержит предыдущее значение? Что такое первичный ключ в таблице?   -  person    schedule 04.04.2013
comment
Является ли вся схема вашей таблицы только этими пятью столбцами???   -  person Eric J. Price    schedule 04.04.2013
comment
Пожалуйста, включите больше информации. Нет детерминированного способа найти предыдущую строку с данными, которые вы включили в вопрос.   -  person Aaron Bertrand    schedule 04.04.2013
comment
Еще раз спасибо за все комментарии, для получения дополнительной информации / столбцов я добавил CSV с фактическими данными! Добавлен первичный ключ (широкий)   -  person laurens    schedule 05.04.2013


Ответы (1)


Вам нужен какой-то номер клиента - чтобы идентифицировать группы. Скажем, это custid:

select t.*,
       (select top 1 
               amount from t t2 where t2.custid = t.custid and t2.month < t.month order by t2.month
       ) as prevAmount
from t
person Gordon Linoff    schedule 04.04.2013
comment
Просто к сведению, похоже, что Month — это строка, поэтому < не будет работать, так как будет сказано, что 1/2013 < 6/2012. - person Aaron Bertrand; 04.04.2013
comment
Извините за макет примера... он не идеален. Но месяц - это дата и время. Я изменю его на дату для полноты картины. Спасибо ‹br› плюс: это французская запись даты, 06.01.2013 - это 01.06.2013; как вы знаете ‹/br› - person laurens; 05.04.2013
comment
Пробовали код, не уверены, что он так работает? Изменится ли это, если вы используете wid ? спасибо - person laurens; 05.04.2013