Ниже я иметь следующую структуру таблицы:Итерация по таблице по дате колонку для каждого общего значения другого столбца
CREATE TABLE StandardTable
(
RecordId varchar(50),
Balance float,
Payment float,
ProcDate date,
RecordIdCreationDate date,
-- multiple other columns used for calculations
)
А вот что небольшой пример того, что мои данные могут выглядеть следующим образом:
RecordId Balance Payment ProcDate RecordIdCreationDate
1 1000 100 2005-01-01 2005-01-01
2 5000 250 2008-01-01 2008-01-01
3 7500 350 2006-06-01 2006-06-01
1 900 100 2005-02-01 NULL
2 4750 250 2008-02-01 NULL
3 7150 350 2006-07-01 NULL
Таблица хранит данные на основе транзакций и содержит миллионы строк. Поле ProcDate указывает месяц, в котором обрабатывается каждая транзакция. Независимо от того, когда транзакция происходит в течение месяца, поле ProcDate жестко закодировано до первого числа месяца, в котором произошла транзакция. Поэтому, если транзакция произошла в 2009-01-17, поле ProcDate будет 2009-01-01 , Я имею дело с историческими данными, и это восходит еще в 2005-01-01. В таблице есть несколько экземпляров каждого RecordId. RecordId будет отображаться в каждом месяце до тех пор, пока столбец «Баланс» не достигнет 0. Некоторые RecordId начинаются с месяца, когда данные начинаются (где ProcDate 2005-01-01), а другие не появляются до более поздней даты. Поле RecordIdCreationDate представляет собой дату начала записи RecordId. Таким образом, эта строка содержит миллионы значений NULL в таблице, поскольку каждый месяц, за который не был создан каждый RecordId, равен NULL.
Мне нужно как-то взглянуть на каждый RecordId и провести несколько разных вычислений на основе месяца. Я имею в виду, что мне приходится сравнивать значения столбцов для каждого RecordId, где ProcDate может быть чем-то вроде 2008-01-01, и сравнивать эти значения с теми же значениями столбцов, где ProcDate будет 2008-02-01. Затем, после выполнения моих расчетов для RecordId в этом месяце, мне нужно сравнить значения с 2008-02-01 с значениями в 2008-03-01 и снова выполнить мои вычисления и т. Д. Я думаю, что я могу сделать это все в пределах одного большого цикла WHILE, но я не совсем уверен, как это будет выглядеть.
Первое, что я сделал, это создать еще одну таблицу в моей базе данных, которая имела тот же дизайн таблицы, что и моя стандартная таблица, и я назвал ее ProcTable. В этом ProcTable я вставил все данные, где RecordIdCreationDate не был равен NULL. Это дало мне первый экземпляр каждого RecordId в базе данных. Я смог выполнить мои вычисления за первый месяц успешно, но там, где я боюсь, я использую значения столбца в ProcTable и сравниваю их с значениями столбцов, где ProcDate - месяц после этого. Даже если бы я мог как-то это сделать, я не знаю, как бы повторить этот процесс, чтобы сравнить данные за 2-й месяц с данными за 3-й месяц и данные за 3-й месяц до данных за 4-й месяц и т. Д.
Любые предложения ? Заранее спасибо.
Если вам просто нужно использовать предыдущие значения, вы можете использовать что-то вроде этого https://sqlscope.wordpress.com/2014/05/26/lag-and-lead-for-sql-server-2008/, если вы пытаясь сохранить текущие итоговые вычисления, вам нужно будет заглянуть в функцию SUM() OVER() – JamieD77