如:
   xh    num1          num2
   1     10015        60080
   2     20022        80090
   3     30250        40900
判断数据重叠区间后最后形成一条记录为:1    10015   80090   xh    num1          num2
   1     10015        30080
   2     20022        50090
   3     60250        90900
处理后为:   xh    num1          num2
   1     10015        50090
   2     60250        90900哪位兄弟帮我分析处理下。谢谢了!!!!

解决方案 »

  1.   

    with tt as
    ( select  1 xh, 10015 num1, 30080 num2 from dual union all
      select  2 xh, 20022 num1, 50090 num2 from dual union all
      select  3 xh, 60250 num1, 90900 num2 from dual
    )
    select row_number()over(order by rn) xh,
           min(num1) num1,
           max(num2) num2
      from 
    (
    select num1,
           num2,
           last_value(case when rn is not null then rn end ignore nulls)over(order by rownum) rn
      from     
    (
    select num1,
           num2,
           lag(num2)over(order by xh),
           (case when num1 - lag(num2)over(order by xh) < 0 then null else xh end) rn
      from tt
    ) t
    ) t1
    group by  rn
      

  2.   

    原理是判断是否可以和上一行合并成同一个区间,如果不可以则处理成另一个分组,可以则处理成同一个分组(+0),最后在每组算最小最大端点即可。但SQL本身没有序运算,这个思路就要写成上面那种嵌套的方式,很费劲。如果是JAVA+SQL环境,还可以用润乾集算器简化:
    A1 $select num1,num2 from tb order by num1
    A2 =a=0
    A3 =A1.groups@o(a+=if(num1>num2[-1],1,0):xh;min(num1):num1,max(num2):num2)工作原理和上面的SQL是一样的,计算结果:
    集算器提供了JDBC接口,可以像数据库一样嵌入到应用中,使用简单也免费。这还有一些有序计算的例子http://blog.raqsoft.cn/?p=5186 .