Sql 基于另一行中某一列的值将值填充到空列

Sql 基于另一行中某一列的值将值填充到空列,sql,oracle,datastage,Sql,Oracle,Datastage,我的要求是选择HIST\u START值,其中status=“CANCELLED”和table=“output\u status”。 将此值放入HIST\u END列,其中table=(“文档状态”或“条目状态”)且HIST\u END为空 例如,第一行和第二行应具有HIST\u END作为12/06/2012(即最后一行的HIST\u START) ID HIST_START HIST_END Appl Number code version STATU

我的要求是选择
HIST\u START
值,其中
status=“CANCELLED”和table=“output\u status”
。 将此值放入
HIST\u END
列,其中
table=(“文档状态”或“条目状态”)且HIST\u END为空
例如,第一行和第二行应具有
HIST\u END
作为
12/06/2012
(即最后一行的
HIST\u START

ID          HIST_START   HIST_END    Appl Number    code    version STATUS   TABLE
10298337    4/06/2012                 1             I45     1   PENDING      DOC_STATUS
10298337    4/06/2012                 1             I45     1   PENDING      ENTRY_STATUS
10298337    4/06/2012    5/06/2012    1             I45     1   PENDING      OUTCOME_STATUS
10298337    5/06/2012    11/06/2012   1             I45     1   ADM_REV      OUTCOME_STATUS
10298337    11/06/2012   11/06/2012   1             I45     1   BAMERROR     OUTCOME_STATUS
10298337    11/06/2012   12/06/2012   1             I45     1   AWAIT_DOCS   OUTCOME_STATUS
10298337    12/06/2012                1             I45     1   CANCELLED    OUTCOME_STATUS
提前感谢。

我相信status=“CANCELLED”和table=“OUTCOME\u status”将为该表中的每个ID只提供一行。 但为了安全起见,我在获取hist_start列值时使用Max()

然后您可以使用下面的update语句来完成您的工作-

UPDATE Table_Name t_1
   SET Hist_End = (SELECT MAX(t_2.Hist_Start)
                     FROM Table_Name t_2
                    WHERE t_2.Status = 'CANCELLED'
                      AND t_2."TABLE" = 'OUTCOME_STATUS'
                      AND t_2.Id = t_1.Id)
 WHERE t_1."TABLE" IN ('DOC_STATUS', 'ENTRY_STATUS')
   AND t_1.Hist_End IS NULL;

格式本来可以稍微好一点。如果有多个
HIST_START
值符合此要求怎么办?感谢您的快速响应。Pratik您的解决方案非常适合我。您好,代码在示例数据上运行良好,但当我尝试在完整数据(200万行)上实现时,查询运行速度非常慢(几年来几乎一直在更新)。在内部查询的where子句中使用的其他列是…t1.id=t2.id和t1.cd=t2.cd和t1.ver=t2.ver和t1.seq=t2.seq和t1.appl=t2=appl。表中没有索引。如果在本例中索引确实是一个问题,或者是性能缓慢的任何其他原因,那么在创建索引时应该使用哪些列。请建议…@Harry as y您已经描述了您对ID、CD、VER、SEQ和APPL列有条件,然后您可以在ID、CD、VER、SEQ、APPL、STATUS和“TABLE”列上创建索引以获得更好的性能。我相信除了这七列之外,此表中还存在其他一些列。