我在SQL Server中有2个表。一个具有每日日期,另一个具有应用更改的日期。需要在第一个表中复制此更改。样本数据是:
TABLE TARGET
Date_ | name | value
---------------------------------------
2011-01-01 00:00:00.000 | msft | NULL
2011-01-02 00:00:00.000 | msft | NULL
2011-01-03 00:00:00.000 | msft | NULL
2011-11-01 00:00:00.000 | amzn | NULL
2011-11-02 00:00:00.000 | amzn | NULL
2011-11-03 00:00:00.000 | amzn | NULL
2011-11-04 00:00:00.000 | amzn | NULL
TABLE SOURCE
Date_ | name | value
---------------------------------------
2004-01-01 00:00:00.000 | msft | 100
2011-01-03 00:00:00.000 | msft | 200
2011-11-01 00:00:00.000 | amzn | 50
我需要什么:
最终目标广告 需要更新源表值,以便使用相应的值更新目标表日期中大于或等于的所有日期。最终目标表应如下所示:
Date_ | name | value
----------------------------------------
2011-01-01 00:00:00.000 | msft | 100
2011-01-02 00:00:00.000 | msft | 100
2011-01-03 00:00:00.000 | msft | 200
2011-11-01 00:00:00.000 | amzn | 50
2011-11-02 00:00:00.000 | amzn | 50
2011-11-03 00:00:00.000 | amzn | 50
2011-11-04 00:00:00.000 | amzn | 50
/*
-- Code
create table #Target (date_ datetime, name varchar(10), value float) create table #Source (date_ datetime, name varchar(10), value float)
insert into #Target select '1/1/2011', 'msft', NULL insert into #Target select '1/2/2011', 'msft', NULL insert into #Target select '1/3/2011', 'msft', NULL insert into #Target select '11/1/2011', 'amzn', NULL insert into #Target select '11/2/2011', 'amzn', NULL insert into #Target select '11/3/2011', 'amzn', NULL insert into #Target select '11/4/2011', 'amzn', NULL
insert into #Source select '1/1/2004', 'msft', 100 insert into #Source select '1/3/2011', 'msft', 200 insert into #Source select '11/1/2011', 'amzn', 50
select * from #Target select * from #Source drop table #Target drop table #Source
*/
到目前为止已经尝试过:
create table #mysource (startdate datetime,
name varchar(10),
value float,
rowid int,
enddate datetime)
insert into #mysource (startdate,name,value)
select date_,name,value
from #source
update #mysource set rowid = subq.RowID
FROM #mysource
inner join (SELECT date_, name, RowId=Row_number() OVER (PARTITION BY name ORDER BY date_)
from #Source) AS subq on subq.date_ = #mysource.startdate AND subq.name = #mysource.name
答案 0 :(得分:0)
这将是源表上的子选择,但只采用按日期降序排序的前一个。像这样:
UPDATE #Target SET value =
(SELECT TOP 1 value FROM #source s WHERE s.name = t.name AND s.Date_ <= t.Date_ ORDER BY s.Date_ DESC)
FROM #Target t
请注意:如果日期重叠,那将是一个更好的测试用例。即所有月份都是01或11而不是混合。
答案 1 :(得分:0)
雅各布发布的查询效果很好。基本上,它会将value
更新为value
表中最近的source
小于date_
表中target
的{{1}}给定name
。
这是一个带有工作演示的SQL小提琴的链接:http://sqlfiddle.com/#!6/20983/1