不好意思,datafields中间的条件是一样的
90<aa.b<=70
70<aa.b<=50
50<aa.b<=10
90<aa.b<=80
80<aa.b<=40
40<aa.b<=10

解决方案 »

  1.   

    在这给你讲一下算法,具体实现自己搞定:
    输入参数:((B,80,40))包含了三个列的值,而以col为准。
    1.定义取col值的一个游标,遍历表cd_data.同时定义一个记录行号的变量:rown。
    2.打开游标循环,判断col值是否为B,如果是B,则跳出循环,记录当前rown。
    3.写三条UPDATE语句:
    a.UPDATE cd_data set end_date=80 where rownum= rown -1;
    b.UPDATE cd_data set start_date=80 and end_date=40 where rownum= rown ;
    c.UPDATE cd_data set start_date=40 where rownum= rown + 1;
    以上只是大概思路。
      

  2.   

    而且lcz022(阿五) 所说的只是针对只有三条记录的情况,如果有多个条记录呢!
    那么你的那三条更新就没有用了!
      

  3.   

    create procedure pro(p_col in varchar2,p_start in number,p_end in number)
    as
    curosr t_sor is
    select col,lag(col,1,null) over(order by col) lag_col,lead(col,1,null) over(order by col) lead_col,start_date,end_date,datafields from cd_data order by col;
    begin
    for v_sor in t_sor loop
    if v_sor.col=p_col then
    update cd_data set end_date=p_start where col=v_sor.lag_col;
    update cd_data set start_date=p_start,end_date=p_end where col=v_sor.col;
    update cd_date set start_date=p_end where col=v_sor.lead_col;
    commit;
    update cd_date set datafields=start_date||'<'||col||'<='||end_date;
    end if;
    end loop;
    end;
    /
      

  4.   

    斑竹大哥啊!不好意思可能我,没有说清楚.你的只是针对于col为A B C 并切是顺序的,
    如果不是A B C 呢,或如果A B C是颠倒的了如下:
    表cd_data
    col       start_date        end_date         datafields
    --------------------------------------------------------
    C            90                70             90<A<=70
    A            70                50             70<B<=50
    B            50                10             50<C<=10

    col       start_date        end_date         datafields
    --------------------------------------------------------
    第一            90                70             90<A<=70
    第二            70                50             70<B<=50
    第三            50                10             50<C<=10
    那么你的结果就不对了啊,请你在看看
      

  5.   

    curosr t_sor is
    select col,lag(col,1,null) over(order by col) lag_col,lead(col,1,null) over(order by col) lead_col,start_date,end_date,datafields from cd_data;
    此处不用order by col
      

  6.   

    可是还是没有解决超过三条记录的限制啊,只能针对本身和上条以及下条操作,如果还有下下条呢!
    col       start_date        end_date         datafields
    --------------------------------------------------------
    C            90                70             90<A<=70
    A            70                50             70<B<=50
    B            50                10             50<C<=10
    D            10                 5             10<C<=5
      

  7.   

    错了:
    col       start_date        end_date         datafields
    --------------------------------------------------------
    C            90                70             90<A<=70
    A            70                50             70<B<=50
    B            50                10             50<C<=10
    D            10                 5             10<D<=5
      

  8.   

    start_date 应该是个主键或有唯一索引,
    于是你可以用 start_date 定位记录位置。
    这样改起来就方便了。
    date类型是用一个7位长的数字存储的,所以可以用于唯一索引。怎么觉得跟我以前设计的冬冬那么像?