对于这个问题的复杂程度,我预先表示歉意,但这就是我要解决的问题。我有一张桌子,上面有500万条记录。在这500万条以上的记录中,我拥有称为列1的大约185,000个唯一值。 Column1是一个varchar字段。然后,我有一个日期字段,我将其称为Column2,它是一个范围从'2005-01-01'到当前日期的日期字段。对于每条记录,都有一个浮点字段,我将其称为Column3。 Column3保存该特定记录的当前汇率。然后有一个不同的浮点字段,我将其称为Column4。该字段包含我需要设置的最后一个费率字段,该字段等于我从Column2获得的上个月的Column3值。棘手的是,我需要对Column1的每个唯一值执行此操作。我希望这是有道理的。现在,我在Column4中的所有数据都为空,但我希望它看起来像您在下面看到的那样。

例如:

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


如您所见,在某些情况下,每个月的费率保持不变,例如Record2。但是,有时它会像Record1一样经常更改。然后在其他情况下,它只更改一次,就像Record3一样。请让我知道您的建议,并先谢谢您。

最佳答案

您可以使用自左联接来获取先前的值,如下所示:

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

关于sql - SQL将单独列的每个唯一值设置为等于上个月的另一列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37119948/

10-09 04:46