用前一个记录中的单元格填充一个空单元格

时间:2013-06-25 08:55:51

标签: sql db2

您好我正在使用DB2 sql填写下表中的一些缺失数据:

Person       House     From           To      
------       -----     ----           --
1            586       2000-04-16     2010-12-03 
2            123       2001-01-01     2012-09-27
2            NULL      NULL           NULL
2            104       2004-01-01     2012-11-24
3            987       1999-12-31     2009-08-01
3            NULL      NULL           NULL

如果第2个人住在3个房子里,但是中间地址不知道在哪里,什么时候。我不知道他们住的是什么房子,但我想带他们住的前一个房子,并使用前面的To date来替换NULL From date,并使用下一个地址信息并使用From date替换null到目前为止。

Person       House     From           To      
------       -----     ----           --
1            586       2000-04-16     2010-12-03 
2            123       2001-01-01     2012-09-27
2            NULL      2012-09-27     2004-01-01
2            104       2004-01-01     2012-11-24
3            987       1999-12-31     2009-08-01
3            NULL      2009-08-01     9999-01-01

据我所知,如果在空地址之前没有先前的地址,则必须保持为null,但如果空地址是最后知道的地址,我想将To date更改为9999-01-01,如人3.。

这种类型的问题在我看来,集合论不再成为一个好的解决方案,但是我需要找到一个DB2解决方案,因为这是我的老板使用的!

欢迎任何指示/建议。

感谢。

1 个答案:

答案 0 :(得分:2)

它可能看起来像这样:

select 
 person,
 house,
 coalesce(from_date, prev_to_date) from_date,
 case when rn = 1 then coalesce (to_date, '9999-01-01')
  else coalesce(to_date, next_from_date) end to_date
from
(select person, house, from_date, to_date,
 lag(to_date) over (partition by person order by from_date nulls last) prev_to_date,
 lead(from_date) over (partition by person order by from_date nulls last) next_from_date,
 row_number() over (partition by person order by from_date desc nulls last) rn
 from temp
) t

上面没有经过测试,但它可能会给你一个想法。

我希望在您的实际表中,您有一个除to_datefrom_date以外的列,允许您为每个人订购行,否则您将无法排序NULL日期,因为您没有知道实际序列的方式。