表:
---------------------------------------------------------
sd    |     starttime    |    endtime        | limittime
2011  |2012-1-1 12:00:00 | 2012-1-3 13:10:11 |      102011  |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  |      102012  |2012-1-10 8:00:00 | 2012-1-10 8:21:11 |      482012  |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就算超时。求出所有超时的记录。

解决方案 »

  1.   

    没有环境
    给你点思路吧。
    用LAG函数可以取的上一条记录的值
    用row_number()over(partition by sd order by endtime desc)可以取剩下个数
    用row_number()over(partition by sd order by endtime acs)=1可以判断第一个开始的记录
    这样你的问题就解决了。
      

  2.   

    SELECT DECODE(SIGN(DECODE(S1,1,endtime-starttime,(endtime-PT)/S2) - limittime*0.3),1,'超时','正常') AS FLG FROM(
    SELECT ROW_NUMBER() OVER(PARTITION BY sd ORDER BY endtime) AS S1,
           ROW_NUMBER() OVER(PARTITION BY sd ORDER BY endtime DESC) AS S2,
           TO_CHAR(TO_DATE(starttime,'YYYY-MM-DD HH24:MI:SS'),'YYYYMMDDHH24MISS') AS starttime,
           TO_CHAR(TO_DATE(endtime,'YYYY-MM-DD HH24:MI:SS'),'YYYYMMDDHH24MISS') AS endtime,
           LAG(TO_CHAR(TO_DATE(endtime,'YYYY-MM-DD HH24:MI:SS'),'YYYYMMDDHH24MISS')) OVER(PARTITION BY sd ORDER BY TO_CHAR(TO_DATE(endtime,'YYYY-MM-DD HH24:MI:SS'),'YYYYMMDDHH24MISS')) AS PT,
           limittime
      FROM TEST)你拿数据试试。我没试过。