在一张表中,其中有一个字段的记录值是递增的(但不规则缺少几个值),要找出缺少的那几个记录值,请问有没有比较好的算法。(记录有几千条)

解决方案 »

  1.   

    1 2 3 4 5 6  8  13 14 18
    缺少7 9 10 11 12
    6+8=14 %2 =0 14/2=7 =>7 
    8+13=21 %2=1 but 21/2=11.5>8 8+1~8+(13-1) =>9 10 11 12  
    14+18=32%2=0 如上
      

  2.   

    只用一句sql解决的方法还没想好,但麻烦点的可以这样:
    再建一个临时表,只有一个数值字段,往里添加数据,从1到几千
    然后
    select id from t2 where id not in (select id from t1);再想想有没有一下子就解决的办法。。
      

  3.   

    有添数的那个时间,你用FOR循环也做完了,找个监视软件看看,就这个东西,到底哪个效率高些?不要想当然,要动手实践下。
      

  4.   

    有添数的那个时间,你用FOR循环也做完了,找个监视软件看看,就这个东西,到底哪个效率高些?不要想当然,要动手实践下。
    ====================================
    添数只需要最多两个sql语句就可以完成了(建临时表占一个sql语句)。。但我没有监视软件,所以也说不定是那种快但我想,用for来循环已经是走头无路才用的办法。但即使是用添临时表的方法,也过不了我自己这关。我想要(我想也是楼主要的)的是用一个sql解决它。
    我也曾考虑过一句sql语句,不过有致命伤,就是如果缺的数是连续三个以上就会出现漏报的情况例如:
    1 2 3 4 5 6  8  13 14 15 18
    缺少7 9 10 11 12 16 17
    用我的语句可以得到7 9  12 16 17,但10、11会遗漏了所以这种方法会适合于存储过程,而不符合我想要的结果(用一个sql解决它)。但我想,在楼主所说的情况下:
    在一张表中,其中有一个字段的记录值是递增的(但不规则缺少几个值),要找出缺少的那几个记录值,请问有没有比较好的算法。(记录有几千条)
    用这种方法的存储过程,还是会比用for来循环高效很多的。。当然,这也是我的“想当然”,因为也是没有测试过。
    再想想有没有一下子就解决的办法。
    也希望数据库版的牛人帮帮忙。
      

  5.   

    dim group as long
    dim lack as long
    先读取第N=group个记录,
    tmp=第group个记录.field("").value  - N
    if lack<tmp then
      for i=1 to group
        检查记录是否连续
      next i
     lack =tmp
    end if
    再读取第N=group+group个记录,重复以上操作。
    //睡觉了,具体代码就不写了。
      

  6.   

    我同意lsftest,可以从SQL来考虑,依靠数据引擎本身来优化搜索。
    不过还没有想到方法。顶贴。
      

  7.   

    我在数据库版帮楼主发了帖问,虽然还没有最终得到我想要的结果,但一位牛人给出了一种指示性的做法,也算是有点收获:
    http://community.csdn.net/Expert/topic/3857/3857175.xml?temp=.3265192
      

  8.   

    很感谢大家!特别要感谢lsfttest的热心帮助!
    谢谢!
      

  9.   

    给你一个思路(折半查找):
    1 首先用一个查询按递增字段排序提取所有记录。
    2 MoveLast, 读取递增字段值,与 RecordCount 比较,得到缺少的记录数。
    3 用 Move 方法移动到中间,同样用字段值与 AbsolutePosition 比较,得到它之前缺失的记录。
    4 如果它的上部没有缺失,折半查找它的下部;如果下部没有缺失,折半查找它的上部;否则两边都折半查找。5 如上递归,直至将折半的单位缩小到2条记录,就可以确定缺失的编号了。