在SQL Server中加入日期范围

时间:2014-07-22 22:37:41

标签: sql-server date inner-join

我在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

2 个答案:

答案 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