首页 新闻 会员 周边 捐助

=====大神们,求一个SQL或存储过程,先谢谢啦=====

0
悬赏园豆:20 [待解决问题]
表:

---------------------------------------------------------

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数据库....
Yang-Onion的主页 Yang-Onion | 初学一级 | 园豆:67
提问于:2012-12-05 11:26
< >
分享
所有回答(1)
0

不知道你的实际表名是什么,把这里的所有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
foreversag | 园豆:267 (菜鸟二级) | 2022-06-01 15:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册