2016-06-06 2 views
1

Ниже я иметь следующую структуру таблицы:Итерация по таблице по дате колонку для каждого общего значения другого столбца

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-й месяц и т. Д.

Любые предложения ? Заранее спасибо.

+0

Если вам просто нужно использовать предыдущие значения, вы можете использовать что-то вроде этого https://sqlscope.wordpress.com/2014/05/26/lag-and-lead-for-sql-server-2008/, если вы пытаясь сохранить текущие итоговые вычисления, вам нужно будет заглянуть в функцию SUM() OVER() – JamieD77

ответ

0

Мне кажется, все, что вам нужно сделать, это соединить таблицу к себе, при этом условии

ON MyTable1.RecordId = MyTable2.RecordId  
AND MyTable1.ProcDate = DATEADD(month, -1, MyTable2.ProcDate) 

Тогда вы будете иметь все строки в таблице (MyTable1), присоединился к одной и той же строке RecordId в со следующего месяца (MyTable2).

И в каждой строке вы можете делать любые вычисления, которые вы хотите, между двумя соединенными таблицами.

Смежные вопросы