SQL - 更新查询 - 更新到下一个不为 NULL 的日期值
Posted
技术标签:
【中文标题】SQL - 更新查询 - 更新到下一个不为 NULL 的日期值【英文标题】:SQL - update query - update to next date value that is not NULL 【发布时间】:2019-03-07 16:44:30 【问题描述】:我有一堆当前日期为 NULL 的值(即在这些特定日期没有可用数据)。
我将如何将这些值更新到有可用数据的下一个日期?
我目前有一个选择查询,它突出显示日期为空值(或由小于 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
因此,此查询为我提供了来自所选数据集中的所有值,这些值位于具有错误数据或 NULL 值的日期。我在查询中还使用了一些“where”和“and”变量,但希望这能提供一个很好的理解基础。
我想将所有这些值更新到未来不为 NULL 的下一个日期(即具有合法数据)。
只是我在想的一个小例子:update table1 set date = (假设这里会有某种选择子查询来定义下一个不为 NULL 的日期值 )。
需要考虑的另一个注意事项:值不为 NULL 的下一个日期是动态的 - 它可能是给定日期的 2 天,但也可能是 2 年。
【问题讨论】:
发布一些示例数据和预期结果以及您解决问题的尝试将非常有帮助。在这里。 您说您不能发布您的实际查询,但您可以发布一个虚拟数据集,其中包含与源数据的数据类型相匹配的假列名以及您拥有的查询的简单版本,已调整为使用虚拟模式。 SO 用户愿意在他们自己的时间免费为您提供帮助,所以请尽量提供帮助 此外,还不清楚您在这里真正想要实现什么。 我将如何将这些值更新到有可用数据的下一个日期。 究竟是什么意思?源数据和期望的输出确实有助于澄清这一点。 您可以修改查询以将机密信息替换为虚拟变量。这个问题在目前的状态下有点难以理解。您想根据信息更改日期(您的查询显示“update table1 set ex_date =”)还是复制其他日期的信息? 感谢大家这么快回复,明天我会添加更多上下文 - 抱歉,在一天结束时匆忙写了这篇文章 - 谢谢你到目前为止的帮助 【参考方案1】:/*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
【讨论】:
试试吧!【参考方案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
【讨论】:
也会尝试一下...甚至没有意识到外部应用是一件事...每天学习新东西 - 只做了一个月的 SQL 但真的很享受它以上是关于SQL - 更新查询 - 更新到下一个不为 NULL 的日期值的主要内容,如果未能解决你的问题,请参考以下文章
SQL:如何在 B 列不为空的情况下使用“100”更新 A 列