0

我在一些 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。表中有 20M 行这样的行。所以也许游标不是最好的选择(?)

非常感谢您的帮助!大号


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

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

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

4

1 回答 1

0

您需要某种类型的客户编号——以识别组。说这是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
于 2013-04-04T17:27:43.783 回答