设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 3543|回复: 17
打印 上一主题 下一主题

[模块/函数] 对多组数据的快速对比 - 新方法

[复制链接]
跳转到指定楼层
1#
发表于 2008-1-10 17:27:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
已经解决,思路见17楼
多谢各位!

数据结构如下啊:
数据1     数据2     数据3
1234.4867           2344.2362           900
1234.4464           2524.2322           243
1274.4567           2354.2342           234
1284.4262           2344.2522           643
1214.4069           2244.2382           233
.......
最多可达到10万条数据

VBA方式实现找出 对数据1 并且数据2  并且数据3  差别在某个值范围内的数据 例如数据1 相差小于0.0003  
数据2 小于0.0004 , 数据3小于10;

我目前的实现方法是通过循环遍列数据;
可以实现;但是有个明显的缺点就是效率极其底!
8000行数据差不多要几分钟时间才能完成!期间犹如死机般另人难以忍受,
考虑过用二分法查找。。但是不知道多组数据怎么实现,一旦排序后是不是会错位?
请明白的哥哥指教 !
多谢了!

[ 本帖最后由 brucewong 于 2008-1-21 15:57 编辑 ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2008-1-11 14:39:08 | 只看该作者
下面是我做的一一对比!

    Dim I
    I = 0
    Do Until Rs8.EOF
        Do Until Rs7.EOF
            TEMjdc = Abs(Round(Rs8("数据1") - Rs7("数据1"), 2))
            TEMwdc = Abs(Round(Rs8("数据2") - Rs7("数据2"), 2))
            TEMfxc = Abs(Rs8("数据3") - Rs7("数据3"))
            If TEMjdc < 0.03 And TEMwdc < 0.03 And TEMfxc < 20 And Rs8("编号") <> Rs7("编号") Then
                I = I + 1
                Rs9.AddNew
                Rs9!problemitem = I
                Rs9("NO") = Rs8!编号 & "<--->" & Rs7!编号
                Rs9("数据11") = Rs8("数据1")
                Rs9("数据21") = Rs8("数据2")
                Rs9("数据31") = Rs8("数据3")
                Rs9("数据12") = Rs7("数据1")
                Rs9("数据22") = Rs7("数据2")
                Rs9("数据32") = Rs7("数据3")
                Rs9.Update
                Rs7.MoveNext
            Else
                Rs7.MoveNext
            End If
        Loop
        Rs8.MoveNext
        Rs7.MoveFirst
    Loop

[ 本帖最后由 brucewong 于 2008-1-21 15:55 编辑 ]
3#
发表于 2008-1-11 15:07:58 | 只看该作者
上下2条语句对比?
4#
 楼主| 发表于 2008-1-11 15:32:33 | 只看该作者
这样说吧,
数据1 的每一条纪录都需要和数据1的所有纪录进行比较,当有符合要求的情况比对该纪录的数据2和所有数据2纪录;不符合要求那么数据1转到下一行纪录;
当数据1,数据2都符合要求时,进行数据3的比对,如果数据1,2,3 都符合要求那么纪录到新的表对比重复结果!
如此类推!
上面的代码也可以通过查询实现但是效率同样不高!

另外上面的代码还有个问题就是
比如说 第10条纪录 和 第1000条纪录 符合选出要求时 “对比重复结果”表会增加一条纪录结构如下
problemitem     NO                 数据11          数据21       数据31     数据12     数据22     数据32
1                    10<--->1000   12.0234        22.2356           33            12.0134     22.2301        30
2                    1000<--->10    12.0134         22.2301          30         12.0234        22.2356          33

会将前面找出来的纪录再对比一次当执行到1000条时
5#
发表于 2008-1-11 15:49:30 | 只看该作者
数据量大的惊人
能否上传例子测试
6#
 楼主| 发表于 2008-1-11 18:04:21 | 只看该作者
附件上传,顺便请帮我检查一下那个进度条
把        'MsgBox L & "--" & L1, vbInformation, "ok"
取消注释 你就能看到它动
运算时怎么有这种情况,我将间隔时间小到了100毫秒都不行!

要测试更多数据只消多复制几次就可以了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
7#
发表于 2008-1-13 12:27:38 | 只看该作者
能用查询就应尽量用查询的方法

在我电脑上,只用1个查询生成和你使用记录集一样的结果,耗时仅是后者的8分1

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
8#
发表于 2008-1-13 13:20:26 | 只看该作者
为什么不用笛卡尔积的方法来求得你要的数据呢
9#
发表于 2008-1-13 13:28:14 | 只看该作者
8000行数据差不多要十几秒时间才能完成!期间犹如死机般另人难以忍受


不知道楼主用的是什么级别的服务器,8000行数据用10多秒,在我的电脑上,就你原有的2300行数据,通过记录集花了我4分多
10#
发表于 2008-1-13 13:28:39 | 只看该作者
SELECT [aFT_PROCESS_1].[编号] & "<---->" & [aFT_PROCESS].[编号] AS [No], AFT_PROCESS_1.数据1 AS [数据1-1], AFT_PROCESS_1.数据2 AS [数据1-2], AFT_PROCESS_1.数据3 AS [数据1-3], AFT_PROCESS.数据1 AS [数据2-1], AFT_PROCESS.数据2 AS [数据2-2], AFT_PROCESS.数据3 AS [数据2-3]
FROM AFT_PROCESS, AFT_PROCESS AS AFT_PROCESS_1
WHERE ((([aft_process].[数据1]-[aft_process_1].[数据1])<0.03) AND (([aft_process].[数据2]-[aft_process_1].[数据2])<0.03) AND (([aft_process].[数据3]-[aft_process_1].[数据3])<20) AND (([aft_process].[编号]-[aft_process_1].[编号])<>0));
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-12 04:12 , Processed in 0.123067 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表