Sql server 在SQL Server中加入日期范围

Sql server 在SQL Server中加入日期范围,sql-server,date,inner-join,Sql Server,Date,Inner Join,我在SQL Server中有两个表。一个有每日日期,另一个有应用更改的日期。此更改需要复制到第一个表中。样本数据为: 表目标 表源 我需要的是: 最终表格目标 需要更新源表值,以便使用相应的值更新目标表日期中大于或等于的所有日期。最终目标表应如下所示: Date_ | name | value ---------------------------------------- 2011-01-01 00:00:00.000 | msft | 100 2011-0

我在SQL Server中有两个表。一个有每日日期,另一个有应用更改的日期。此更改需要复制到第一个表中。样本数据为:

表目标

表源

我需要的是:

最终表格目标 需要更新源表值,以便使用相应的值更新目标表日期中大于或等于的所有日期。最终目标表应如下所示:

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

这将是源表上的一个子选择,但只取按日期降序排列的最上面的一个。像这样:

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

注意:如果日期重叠,这将是一个更好的测试用例。i、 e.所有月份不是1个月就是11个月,而不是混合月份。

雅各布发布的查询非常有效。基本上,它会将该值更新为源表中小于给定名称目标表中日期的最新值


这里有一个链接,指向一个SQL fiddle和一个正在运行的演示:

您能展示一下您所尝试的吗?我没有看到任何where子句anywhere@brad你是说我是如何完成最终目标的?我是手工完成的。正在查找SQLServer代码。我尝试了按和rowids分区。可以使它工作,但它看起来像一个非常肮脏的解决方案。正确。让你说够了的尝试!我需要上网。这一步也应该贴在这里。好的,到目前为止,看起来你刚刚说这是我想要的,有人帮我做。不用亲自尝试…伙计们。。这就是我现在的位置。我不想在rowids上循环。除非这是我唯一的选择,否则这不是一个好的解决方案。你能不能停止判断为什么会问这个问题?我花了更多的时间键入它,所以在发布它时,我非常确定我的SQL限制。我目前的代码如下。谢谢你的帮助。
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
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