[code="sql"]
select x.*,sys_connect_by_path(to_char(x.up_time,'yyyy-MM-dd hh:mi:ss'), '/' ) from (
select a.*,(select min(up_time) from t_test b where b.up_time >= a.add_time) next_time
from(
select t.*,t.up_time + 1/(24*60*60)*5 add_time from t_test t
) a
) x
start with x.up_time = to_date('2014-03-31 12:20:30','yyyy-MM-dd hh:mi:ss')
connect by prior x.next_time = x.up_time
[/code]
主要思路是通过oracle的connect by 递归实现,但实现的时候有个问题,就是你的表缺少字段来连接上下记录,所以要自己模拟
上面sql主要分成以下几个步骤:
1.[code="sql"]select t.*,t.up_time + 1/(24*60*60)*5 add_time from t_test t[/code]
增加一列表示up_time加上5秒是哪个时间,结果如果下:
[quote]
1 2014-03-31 12:20:30 2014-03-31 12:20:35
1 2014-03-31 12:20:35 2014-03-31 12:20:40
1 2014-03-31 12:20:36 2014-03-31 12:20:41
1 2014-03-31 12:21:01 2014-03-31 12:21:06
1 2014-03-31 12:21:03 2014-03-31 12:21:08
1 2014-03-31 12:21:05 2014-03-31 12:21:10
1 2014-03-31 12:21:11 2014-03-31 12:21:16
1 2014-03-31 12:21:15 2014-03-31 12:21:20
1 2014-03-31 12:21:18 2014-03-31 12:21:23
[/quote]
2.[code="sql"]select a.*,(select min(up_time) from t_test b where b.up_time >= a.add_time) next_time
from(
select t.*,t.up_time + 1/(24*60*60)*5 add_time from t_test t
) a[/code]
在步骤一的基础上,增加一列next_time,即根据步骤一计算出的列add_time(也就是up_time加上5秒的值)来得到此add_time与原表数据中的up_time哪个最近。结果如下:
[quote]
1 2014-03-31 12:20:30 2014-03-31 12:20:35 2014-03-31 12:20:35
1 2014-03-31 12:20:35 2014-03-31 12:20:40 2014-03-31 12:21:01
1 2014-03-31 12:20:36 2014-03-31 12:20:41 2014-03-31 12:21:01
1 2014-03-31 12:21:01 2014-03-31 12:21:06 2014-03-31 12:21:11
1 2014-03-31 12:21:03 2014-03-31 12:21:08 2014-03-31 12:21:11
1 2014-03-31 12:21:05 2014-03-31 12:21:10 2014-03-31 12:21:11
1 2014-03-31 12:21:11 2014-03-31 12:21:16 2014-03-31 12:21:18
1 2014-03-31 12:21:15 2014-03-31 12:21:20
1 2014-03-31 12:21:18 2014-03-31 12:21:23
[/quote]
3.这就可以根据步骤二得到的表结构进行oracle递归查询了,查询条件就是根据next_time=up_time来进行