计算T-SQL中的上一个值(更新)

计算T-SQL中的上一个值(更新),sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我正在为一些SQL逻辑而挣扎,更不用说是挣扎了 数据集示例 在我拥有的前5列中,我想“计算”最后一列:PreviousAmount。 对我来说,问题是,每次都会重新加载所有6个月的数据,因此仅查看“已更改”的值是不够的,您还必须考虑历史记录。 我第一次有一段代码,其中一行与下一行进行了CTE比较,但像这样,我错过了历史 这里的情况是:客户每月要支付的金额可以更改: 在本例中,将其从20更改为10到25 我上传了一个CSV文件或我正在使用的数据集: 我们正在使用SQLServer2008R2。

我正在为一些SQL逻辑而挣扎,更不用说是挣扎了

数据集示例

在我拥有的前5列中,我想“计算”最后一列:PreviousAmount。 对我来说,问题是,每次都会重新加载所有6个月的数据,因此仅查看“已更改”的值是不够的,您还必须考虑历史记录。 我第一次有一段代码,其中一行与下一行进行了CTE比较,但像这样,我错过了历史

这里的情况是:客户每月要支付的金额可以更改: 在本例中,将其从20更改为10到25

我上传了一个CSV文件或我正在使用的数据集:

我们正在使用SQLServer2008R2。 表中有2000万行这样的行。所以光标可能不是最好的选择

非常感谢您的帮助!! L

更新: 我添加了一个wid列,因为原始数据集也包含一个wid列。 @Mark Bannister逻辑是查看“金额”,以及当用户在某个月更改金额时: *当“新金额”出现时,将更新接下来的所有月份 *我们计算以前的金额,即=以前的金额

@Love2Learn也感谢您的评论。有更多的列,但您必须知道在stackoverflow代码块中添加更多的列并不容易。 因此,我还上传了一个CSV文件,您可以从中找到链接。我确实添加了一个相关的栏目“wid”

通常应该有足够的信息和列来计算前一行。 提前谢谢!

您需要某种类型的客户编号-以识别群组。假设这是custid:


确定哪一行保存前一个值的逻辑是什么?表上的主键是什么?表架构的整个部分就是这五列吗???请包含更多信息。没有确定的方法可以找到包含在问题中的数据的前一行。再次感谢所有评论,有关更多信息/列,我添加了带有实际数据的CSV!主键添加widJust仅供参考,看起来月份是一个字符串,所以很抱歉这个示例的布局…它并不完美。但月份是一个日期时间。为了完整起见,我将把它改为日期。感谢加:这是法国日期符号,2013年6月1日是2013年6月1日;正如您所知,您尝试了代码,但不确定它是否是这样工作的?如果您使用wid,它会改变吗?谢谢
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
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