您好我正在使用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解决方案,因为这是我的老板使用的!
欢迎任何指示/建议。
感谢。
答案 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_date
和from_date
以外的列,允许您为每个人订购行,否则您将无法排序NULL日期,因为您没有知道实际序列的方式。