解决方案 »

  1.   

    是2000的数据库,如果是非2000的也可以参考一下,主要是公司里面用的SQL2000的安装不上SQL2000以上的版本,家里用的SQL2008。不要用游标,游标是已经实现了,有没办法。
      

  2.   

    是我说错了,不用分组,是按照AA,BB,CC来排序,我改一下描述不好意思。
      

  3.   

    按你的数据,还是要分组,不然aa里面的2会和1计算,按照你的数据,应该是按AA分组,BB排序
      

  4.   

    倒!没有权限修改。要求:据据aa,bb,cc排序(我插入的测试数据已经排好序了),根据cc列计算dd的列:如果cc2-cc1<5,则dd2=dd1否则数据不变(即同一组中本行的C值比较上行的值,如果小于5,本行dd列等于上一行列,cc2代表本行,cc1代表上一行)
    需求简言之就是本行比较上一行的值得到结果。
      

  5.   

    SQL2000的方法,create table aaa1
    ( aa int,
      bb int,
      cc int,
      dd int)insert into aaa1 values(1,1,1,10)
    insert into aaa1 values(1,2,2,40)
    insert into aaa1 values(1,3,13,50)
    insert into aaa1 values(1,5,15,30)
    insert into aaa1 values(2,3,2,20)
    insert into aaa1 values(2,5,5,60)
    -- 更新
    select aa,bb,cc,dd,
             (select count(1) from aaa1 b 
              where b.aa=a.aa and b.bb<=a.bb) 'rn'
      into #t
      from aaa1 aupdate x
     set x.dd=case when y.rn is null then x.dd
                   when (x.cc-y.cc)<5 then y.dd
                   else x.dd end
     from #t x
     left join #t y on x.aa=y.aa and x.rn=y.rn+1update a
     set a.dd=b.dd
     from aaa1 a
     inner join #t b on a.aa=b.aa and a.bb=b.bb and a.cc=b.ccselect * from aaa1/*
    aa          bb          cc          dd
    ----------- ----------- ----------- -----------
    1           1           1           10
    1           2           2           10
    1           3           13          50
    1           5           15          50
    2           3           2           20
    2           5           5           20(6 row(s) affected)
    */drop table #t
      

  6.   

    是这样吗:--drop table aaa1create table aaa1
    (
    aa int,
    bb int,
    cc int,
    dd int
    )
    go
    insert into aaa1 values(1,1,1,10)
    insert into aaa1 values(1,2,2,40)
    insert into aaa1 values(1,3,13,50)
    insert into aaa1 values(1,5,15,30)
    insert into aaa1 values(2,3,2,20)
    insert into aaa1 values(2,5,5,60)
    select aa,bb,cc,
           case when (select top 1 a2.cc
                      from aaa1 a2
      where a1.aa = a2.aa
        and a1.bb > a2.bb
      order by bb desc) is null
     then dd
            when cc - (select top 1 a2.cc
                           from aaa1 a2
           where a1.aa = a2.aa
             and a1.bb > a2.bb
           order by bb desc) < 5
     then (select top 1 a2.dd
                           from aaa1 a2
           where a1.aa = a2.aa
             and a1.bb > a2.bb
           order by bb desc)
         else dd
    end as dd
    from aaa1 a1
    /*
    aa bb cc dd
    1 1 1 10
    1 2 2 10
    1 3 13 50
    1 5 15 50
    2 3 2 20
    2 5 5 20
    */
      

  7.   

    呵呵,修改一下,加了一个update语句:
    --drop table aaa1create table aaa1
    (
    aa int,
    bb int,
    cc int,
    dd int
    )
    go
    insert into aaa1 values(1,1,1,10)
    insert into aaa1 values(1,2,2,40)
    insert into aaa1 values(1,3,13,50)
    insert into aaa1 values(1,5,15,30)
    insert into aaa1 values(2,3,2,20)
    insert into aaa1 values(2,5,5,60)
    --更新数据
    update aaa1
    set dd = 
    (
    select --aa,bb,cc,
           case when (select top 1 a2.cc
                      from aaa1 a2
      where a1.aa = a2.aa
        and a1.bb > a2.bb
      order by bb desc) is null
     then dd
            when cc - (select top 1 a2.cc
                           from aaa1 a2
           where a1.aa = a2.aa
             and a1.bb > a2.bb
           order by bb desc) < 5
     then (select top 1 a2.dd
                           from aaa1 a2
           where a1.aa = a2.aa
             and a1.bb > a2.bb
           order by bb desc)
         else dd
    end as dd
    from aaa1 a1
    where a1.aa = aaa1.aa and 
          a1.bb = aaa1.bb and 
          a1.cc = aaa1.cc
    )
    --查询数据,发现字段dd已经更新
    select *
    from aaa1
    /*
    aa bb cc dd
    1 1 1 10
    1 2 2 10
    1 3 13 50
    1 5 15 50
    2 3 2 20
    2 5 5 20
    */
      

  8.   

    两种不同的方法都挺好,学习了,那个更快,都比游标快多了。还有其它的方法嘛,SQL2005有其它的方法?