Определенно есть несколько способов сделать это. Вы найдете плюсы и минусы в зависимости от размера вашего набора данных и других факторов.
Вот моя рекомендация ...
Declare @table as table
(
EOMDate DateTime,
DandA float,
Coupon Float,
EarnedIncome Float
)
Insert into @table Values('04/30/2008', 20187.5,17812.5,NULL)
Insert into @table Values('05/31/2008', 24640.63, 22265.63, NULL)
Insert into @table Values('06/30/2008', 2375, 26718.75,NULL)
--If we know that EOMDate will only contain one entry per month, and there's *always* one entry a month...
Update @Table Set
EarnedIncome=DandA-
(Select top 1 DandA
from @table t2
where t2.EOMDate<T1.EOMDate
order by EOMDate Desc)+Coupon
From @table T1
Select * from @table
--If there's a chance that there could be more per month, or we only want the values from the previous month (do nothing if it doesn't exist)
Update @Table Set
EarnedIncome=DAndA-(
Select top 1 DandA
From @table T2
Where DateDiff(month, T1.EOMDate, T2.EOMDate)=-1
Order by EOMDate Desc)+Coupon
From @Table T1
Select * from @table
--Leave the null, it's good for the data (since technically you cannot calculate it without a prior month).
Мне больше нравится второй метод, потому что он будет рассчитываться только при наличии записи за предыдущий месяц.
(добавьте следующее к приведенному выше сценарию, чтобы увидеть разницу)
--Add one for August
Insert into @table Values('08/30/2008', 2242, 22138.62,NULL)
Update @Table Set
EarnedIncome=DAndA-(
Select top 1 DandA
From @table T2
Where DateDiff(month, T1.EOMDate, T2.EOMDate)=-1
Order by EOMDate Desc
)+Coupon
From @Table T1
--August is Null because there's no july
Select * from @table
Это все вопрос именно того, что вы хотите.
Используйте запись непосредственно перед текущей записью (независимо от даты) или используйте ТОЛЬКО запись, которая находится за месяц до текущей записи.
Извините за формат ... Редактор ответов Stackoverflow.com и я не очень хорошо играем вместе.
: D