表:
---------------------------------------------------------
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就算超时。求出所有超时的记录。
---------------------------------------------------------
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就算超时。求出所有超时的记录。
给你点思路吧。
用LAG函数可以取的上一条记录的值
用row_number()over(partition by sd order by endtime desc)可以取剩下个数
用row_number()over(partition by sd order by endtime acs)=1可以判断第一个开始的记录
这样你的问题就解决了。
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)你拿数据试试。我没试过。