Oracle SQL-根据以前的记录填充列,并保留没有以前数据为空的记录

Oracle SQL-根据以前的记录填充列,并保留没有以前数据为空的记录,sql,oracle,Sql,Oracle,我在表格中设置了一些列,如下所示: ID IDSEQUENCENUM DATE 1 1 20050101 1 2 1 3 1 4 20050505 2 1 20120303 2 2 20120404 2 3

我在表格中设置了一些列,如下所示:

ID      IDSEQUENCENUM   DATE
1       1               20050101
1       2               
1       3               
1       4               20050505
2       1               20120303
2       2               20120404
2       3               
3       1               
3       2
3       3               20140505
...
merge into dates dt2 using 
(
select id, idseq, 
       case when dateval is null then last_value(dateval) ignore nulls over (partition by id order by idseq) else dateval
       end as dateval
from dates
order by id, idseq
) dt
on (DT2.ID = dt.id and DT2.IDSEQ = dt.idseq )
when matched then
update set DT2.DATEVAL = dt.dateval
我需要做的是,当日期为空时,将其作为该ID内的上一个IDSEQUENCENUM填写。如果该ID/IDSEQUENCENUM没有上一个日期,则将其保持为空。因此,之后,上面的内容将如下所示:

ID      IDSEQUENCENUM   DATE
1       1               20050101
1       2               20050101
1       3               20050101
1       4               20050505
2       1               20120303
2       2               20120404
2       3               20120404
3       1               
3       2
3       3               20140505
...
无法确定每个记录之间的日期将有多少空值

谢谢你的帮助


哦,如果您好奇的话,由于使用此数据的程序需要接受它的方式,因此日期是varchar2格式的

我认为这就是您要寻找的,遵循前面的答案:

select id, idseq, 
       case when dateval is null then last_value(dateval) ignore nulls over (partition by id order by idseq) else dateval
       end as dateval
from dates
order by id, idseq;
要进行更新更改,请执行以下操作:

ID      IDSEQUENCENUM   DATE
1       1               20050101
1       2               
1       3               
1       4               20050505
2       1               20120303
2       2               20120404
2       3               
3       1               
3       2
3       3               20140505
...
merge into dates dt2 using 
(
select id, idseq, 
       case when dateval is null then last_value(dateval) ignore nulls over (partition by id order by idseq) else dateval
       end as dateval
from dates
order by id, idseq
) dt
on (DT2.ID = dt.id and DT2.IDSEQ = dt.idseq )
when matched then
update set DT2.DATEVAL = dt.dateval

我希望这会有所帮助。

下面的查询使用带有列名和表名的\u horse\u获得预期结果

select 
  s1.id,
  s1.idsequencenum, 
  case
    when s1.date_col is null then max(s2.date_col)
    else s1.date_col
  end modified_date_col
from simple s1
left outer join simple s2
on s2.id = s1.id and s2.idsequencenum < s1.idsequencenum and s2.date_col is not null --and s1.date_col is null
group by 
  s1.id,
  s1.idsequencenum, 
  s1.date_col
order by
  s1.id,
  s1.idsequencenum;

更新了select语句,效果非常好!谢谢然而,当我试图将其更改为实际更改行的更新时,当它达到最后一个值时,我遇到了错误“ORA-30483:此处不允许使用窗口函数”。您能对此提供一些见解吗?您可以使用MERGE语句根据任意查询更新表。提供新值的查询将转到USING子句。@Florian是的,这是正确的,您可以使用合并从查询更新,我将使用Florian建议编辑我的答案。此select语句也非常有效,谢谢!然而,当我尽力将其转换为update语句时,我又一次遇到了麻烦,就像下面的代码一样。除了这次我得到一个“ORA-00934:这里不允许使用组函数”。我有两个很好的答案,但却不能与之合作,这让我觉得很傻:哦,好吧,至少我在学习,对吧?正如弗洛里安在另一篇评论中建议的那样,你可以使用MERGE语句。请看上面修改的答案。合并成功了!当然你们都知道我不熟悉这个方法。这是一个多么伟大的社区啊。谢谢大家的帮助!