表: --------------------------------------------------------- sd | starttime | endtime | limittime 2011 |2012-1-1 12:00:00 | 2012-1-3 13:10:11 | 10 2011 |2012-1-1 12:00:00 | 2012-1-4 12:10:11 | 10 2011 |2012-1-1 12:00:00 | 2012-1-5 8:90:11 | 10 2012 |2012-1-10 8:00:00 | 2012-1-10 8:21:11 | 48 2012 |2012-1-10 8:00:00 | 2012-1-10 12:21:11| 48 2012 |2012-1-10 8:00:00 | 2012-1-11 8:21:11 | 48 2012 |2012-1-10 8:00:00 | 2012-1-13 13:21:11| 48 2012 |2012-1-10 8:00:00 | 2012-1-14 8:21:11 | 48 2012 |2012-1-10 8:00:00 | 2012-1-16 0:21:11 | 48 ------------------------------------------------------- 条件: 1:sd相同的记录,endtime最小的那条记录,执行时间是总时间limittime长度的30%,超过就算超时。第一条,实际执行时间是:endtime-starttime 例如:sd为2011的,endtime最小的是2012-1-3 13:10:11,它的实际执行时间是2012-1-3 13:10:11 -2011-1-1 12:00:00 = 49.x小时 > 3( limittime*30%) -->超时 2:sd相同的记录,如果endtime不是最小的记录,实际执行时间(endtime - 上一个endtime) > 执行时间(limittime - limittime *30%)/剩下个数 -->超时 例如: sd为2012的, 2012 |2012-1-10 8:00:00 | 2012-1-10 8:21:11 | 48 第一条,执行时间是48*30% 2012 |2012-1-10 8:00:00 | 2012-1-10 12:21:11| 48 第二条 :实际执行时间 4小时 (2012-1-10 12:21:11 本次的endtime - 2012-1-10 8:21:11 上一个endtime) < 6.7小时=(48-48*30%)/5 --不超时, 如果实际执行时间大于6.7就算超时。 求出所有超时的记录。 Oracle数据库....
不知道你的实际表名是什么,把这里的所有test替换成你的表名
select t4.sd,t4.starttime,t4.endtime,t4.limittime from
(
select case t1.row_num
when 1 then ROUND(TO_NUMBER(t1.endtime - t1.starttime) * 24)
-t1.limittime * 0.3 --总时限*0.3
else round(to_number(t1.endtime -
(select t2.endtime
from (select row_number() over
(partition by sd order by endtime asc) as row_num,sd ,endtime from test) t2
where t2.row_num = t1.row_num -1 and t2.sd = t1.sd) --上一个endtime
)*24)
-(t1.limittime * 0.7)/ --总时限*0.7
((select count(*) from test t3 where t3.sd = t1.sd)-1) -- 每个sd总个数-1
end as abc, -- 执行时间-时限
t1.sd,t1.starttime,t1.endtime,t1.limittime
from
(select row_number() over
(partition by sd order by endtime asc) as row_num, sd,starttime,endtime,limittime from test) t1
) t4
where t4.abc >=0