SQL set列等于上个月的另一列,用于单独列的每个唯一值

Joh*_*les 2 sql t-sql sql-server sql-server-2008 sql-update

我提前道歉这个问题看起来有多复杂,但这就是我正在处理的问题.我有一张包含500万条记录的表格.在这500万条记录中,我有大约185,000个我称之为Column1的唯一值.Column1是varchar字段.然后我有一个日期字段,我称之为Column2,这是一个日期字段,范围从'2005-01-01'到当前日期.对于每条记录,都有一个浮点字段,我称之为Column3.Column3保存该特定记录的当前汇率.然后有一个不同的浮点字段,我称之为Column4.这个字段保存了我需要设置的最后一个速率字段,它等于Column3的值来自我从Column2获得的上一个月.棘手的部分是我需要为Column1的每个唯一值执行此操作.我希望这是有道理的.现在我在Column4中的所有数据都是null,但我希望它看起来像你在下面看到的那样.

例如:

Column1      Column2      Column3      Column4
Record1      2005-01-01   6.25         6.25
Record2      2005-01-01   5.625        5.625
Record3      2005-01-01   4.75         4.75

Record1      2005-02-01   6.5          6.25
Record2      2005-02-01   5.625        5.625
Record3      2005-02-01   4.75         4.75

Record1      2005-03-01   6.75         6.5
Record2      2005-03-01   5.625        5.625
Record3      2005-03-01   5            4.75
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,有些情况下,每个月的费率与Record2一样保持不变.但是,有时候它经常像Record1一样发生变化.然后还有一些时候它只会像Record3那样改变一次.请让我知道您的建议,并提前感谢您.

Adu*_*cci 5

您可以使用自我左连接来获取前一个值,如下所示:

declare @t table (column1 varchar(10), column2 datetime, column3 float, column4 float)

insert into @t (column1, column2, column3)
select 'RecordA', '2005-01-01', 6.25 union all
select 'RecordB', '2005-01-01', 5.625 union all
select 'RecordC', '2005-01-01', 4.75 union all
select 'RecordA', '2005-02-01', 6.5 union all
select 'RecordB', '2005-02-01', 5.625 union all
select 'RecordC', '2005-02-01', 4.75 union all
select 'RecordA', '2005-03-01', 6.75 union all
select 'RecordB', '2005-03-01', 5.625 union all
select 'RecordC', '2005-03-01', 5

update cur
set column4 = pre.column3 
from @t as cur
left join @t as pre on
    cur.column1 = pre.column1 and
    dateadd(mm, -1, cur.column2) = pre.column2 


select * 
from @t 
order by column2, column1
Run Code Online (Sandbox Code Playgroud)