SQL-update query-update to next date值不为空

SQL-update query-update to next date值不为空,sql,sql-server,Sql,Sql Server,我有一堆值,它们当前的日期为空值,即在这些特定日期没有可用的数据 我如何将这些值更新到下一个数据可用的日期 我当前有一个select查询,它突出显示了日期上的所有值,这些值都是空值或由小于0的值定义的假数据: select * from table1 a left join table2 b on a.id=b.id and a.date=b.date --joins dates table to main data set where a.id in (select c.id from t

我有一堆值,它们当前的日期为空值,即在这些特定日期没有可用的数据

我如何将这些值更新到下一个数据可用的日期

我当前有一个select查询,它突出显示了日期上的所有值,这些值都是空值或由小于0的值定义的假数据:

select * from table1 a 
left join table2 b on a.id=b.id and a.date=b.date --joins dates table to main data set

where a.id in (select c.id from table3 c
left join table4 d on c.id=d.id where c.value = 000000) -- sub query identifying sub set of data I want to use as 'id' list

and a.date is not NULL and a.date > '1900-01-01' --a.date not NULL just identifies illegitimate date values that I don't want to see
and (b.value is NULL or b.value < 0) --identifies legitimate values that fall on dates where there are NULL values or false dates
因此,这个查询为我提供了所选数据集中的所有值,这些值都位于数据为假或为空的日期。我在查询中还使用了一些“where”和“and”变量,但这有望为理解提供良好的基础

我想将所有这些值更新到未来的下一个日期,该日期不为空,即具有合法数据

这只是我思考的一个小例子:updatetable1 set date=假设这里有某种select子查询来定义下一个不为NULL的日期值


需要考虑的另一个注意事项是:值不为NULL的下一个日期是动态的-可能是从给定日期算起的2天,但可能是2年。

您可以使用apply解决它

UPDATE T
SET Date = N.Date
FROM yourTable T
OUTER APPLY (
    SELECT TOP 1 Date FROM YourTable 
    WHERE ........
    ORDER BY ..........
) N
WHERE T.Date IS NULL

发布一些示例数据和预期结果,以及您解决问题的尝试将非常有帮助。这里,你说你不能发布你的实际查询,但是你可以发布一个伪数据集,其中包含与源数据的数据类型相匹配的伪列名,以及一个简单版本的查询,并调整为使用伪模式。因此,用户在自己的时间内免费为您提供帮助,因此请尽可能提供帮助。此外,目前还不清楚您在这里真正想要实现什么。我如何将这些值更新到下一个数据可用的日期。实际上是什么意思?源数据和所需的输出确实有助于澄清这一点。您可以修改查询,用虚拟变量替换机密信息。这个问题在目前的状态下有点难以理解。你想根据信息更改日期吗?你的查询显示update table1 set ex_date=或复制其他日期的信息?感谢你这么快回复,伙计们,我明天会添加更多内容-抱歉,在一天结束时匆匆写下这篇文章-感谢你迄今为止的帮助,我会尝试一下!我也会尝试一下…甚至没有意识到外部应用是一件事…每天学习新的东西-只做了一个月的SQL,但真的很享受它
/*I would create a variable table @mytab in which I will put sample sample data
with dates and null*/
--Kamel Gazzah
--07/03/2019
declare @mytab as table(id int identity(1,1),mydate  date)

insert into @mytab values('01/01/2018')
insert into @mytab values(NULL)
insert into @mytab values('01/05/2018')
insert into @mytab values('01/07/2018')
insert into @mytab values('01/08/2018')
insert into @mytab values(NULL)
insert into @mytab values(NULL)
insert into @mytab values(NULL)
insert into @mytab values('01/08/2018')

select * from @mytab


--First Method with **OUTER APPLY**
update t1 set mydate=t2.mydate
--select t1.*,t2.mydate 
from @mytab t1
OUTER APPLY (select top 1 * from @mytab where mydate is not null and id > t1.id order by mydate) t2 
where t1.mydate is null



--SCOND METHOD WITH **LEFT OUTER JOIN**
update ta set mydate=tc.mydate
--select ta.id,tc.mydate 
from @mytab ta 
inner join(
select id1,min(id2) id2 from(
select t1.id id1,t2.id id2,t2.mydate from @mytab t1
left outer join @mytab t2 on t2.id > t1.id and t2.mydate is not null
where t1.mydate is null) v group by id1) tb on ta.id=id1
inner join @mytab tc on  tb.id2=tc.id

select * from @mytab