原文地址:oracle中分析函数获取之前最近的不为null的值 作者:lihy114
oracle通过分析函数获取当前行之前的不为空的值
使用last_value,但是要注明ignore nulls
比如有数据如下:
RN ADDRESS ARRIVAL_TIME USERID
------ ---------- ------------------- ---------
1 A1 2012-7-9 下午12:03:21 1
(null) A2 2012-7-9 下午12:04:21 2
(null) A3 2012-7-9 下午12:05:21 3
2 A1 2012-7-9 下午12:08:21 4
(null) A2 2012-7-9 下午12:09:21 5
(null) A3 2012-7-9 下午12:10:21 6
3 A1 2012-7-9 下午12:13:21 7
(null) A3 2012-7-9 下午12:15:21 8
4 A1 2012-7-9 下午12:18:23 9
5 A1 2012-7-9 下午12:19:21 10
(null) A2 2012-7-9 下午12:20:21 11
(null) A3 2012-7-9 下午12:21:21 12
6 A1 2012-7-9 下午12:23:23 13
(null) A2 2012-7-9 下午12:24:21 14
select rn,address,arrival_time,userid,last_value(rn ignore nulls) over(order by userid) from test
查询结果如下:
RN ADDRESS ARRIVAL_TIME USERID GROUP_T
------ ---------- ------------------- --------- ----------
1 A1 2012-7-9 下午12:03:21 1 1
(null) A2 2012-7-9 下午12:04:21 2 1
(null) A3 2012-7-9 下午12:05:21 3 1
2 A1 2012-7-9 下午12:08:21 4 2
(null) A2 2012-7-9 下午12:09:21 5 2
(null) A3 2012-7-9 下午12:10:21 6 2
3 A1 2012-7-9 下午12:13:21 7 3
(null) A3 2012-7-9 下午12:15:21 8 3
4 A1 2012-7-9 下午12:18:23 9 4
5 A1 2012-7-9 下午12:19:21 10 5
(null) A2 2012-7-9 下午12:20:21 11 5
(null) A3 2012-7-9 下午12:21:21 12 5
6 A1 2012-7-9 下午12:23:23 13 6
(null) A2 2012-7-9 下午12:24:21 14 6
除了last_value(rn ignore nulls),到了11g r2,oracle还支持了lag(rn ignore nulls)和lead(rn ignore nulls)