你可以先把所有的记录按照AId的逆序排列选出,然后在进行差分操作
这只是一个初步思路,你再想想

解决方案 »

  1.   

    select rowid int identity(1,1),* into #temp from 表A
    select b.Data-a.Data DataDiff into 新表 from #temp A join #temp B on A.rowid=B.rowid+1
      

  2.   

    写错了,更正:
    select identity(1,1) rowid,* into #temp from 表A
    select b.Data-a.Data DataDiff into 新表 from #temp A join #temp B on A.rowid=B.rowid+1
      

  3.   

    加一个:select a.data-b.data from 表a a,表a b where a.Aid>b.aid and b.aid in (select max(aid) from 表a where aid<a.aid)
      

  4.   

    select a.data-b.data from 表a a,表a b where b.aid = (select max(aid) from 表a where aid<a.aid)
      

  5.   

    补充:
    select a.data-b.data from 表a a,表a b where b.aid in (select max
    -------------------------------------------^^^去掉and也行呀!
    (aid) from 表a where aid<a.aid)
      

  6.   

    哦! CCEO()大侠已经发现了!呵呵!
      

  7.   

    多谢各位的帮助,我来总结一下:pengdali(大力)的方法是程序化的方法,比较容易理解。缺点在于似乎只适用于MSSQL,移植性不好。j9988(j9988)的方法很好,效率也不错,不过正像pengdali(大力)所说,还有化简的余地。主要就是 a.AId>b.AId 这个条件其实没必要。CCEO()的结果可以看作是在j9988(j9988)的基础上化简而得。其实像最后CCEO()写出来的这个语句,我更喜欢写成这样:SELECT a.Data - b.Data AS DataDiff
    FROM 表A a INNER JOIN
          表A b ON b.AId =
              (SELECT MAX(AId)
             FROM 表A
             WHERE AId < a.AId)我比较喜欢用INNER JOIN而不是CROSS JOIN,呵呵。我觉得INNER JOIN快一点,可能是心理作用吧,执行效率应该是一样的,可能不同的数据库系统还有不同的内部处理方法。很高兴能解决这个问题,给分。
      

  8.   

    有句话不得不说:
    select ... from a,b where a.id=b.id
    不是CROSS JOIN,而是inner join
      

  9.   

    我说呀,我也觉得奇怪,应该是INNER JOIN的。但是当我在MSSQL EnterpriseMan中查询输入select a.data-b.data from TestA a,TestA b where b.aid = (select max(aid) from TestA where aid<a.aid)系统自动就给格式化成这样了:
    SELECT a.Data - b.Data AS Expr1
    FROM TestA a CROSS JOIN
          TestA b
    WHERE (b.AId =
              (SELECT MAX(aid)
             FROM TestA
             WHERE aid < a.aid))不然你自己试试?可能是与WHERE字句有关系,如果WHERE字句是where a.id=b.id,当然就应解释成INNER JOIN;如果WHERE字句复杂一些,可能就解释成CROSS JOIN。