设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 3830|回复: 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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
18#
 楼主| 发表于 2008-1-21 16:03:42 | 只看该作者
原帖由 rjacky 于 2008-1-13 12:27 发表
能用查询就应尽量用查询的方法

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

27849

多谢哥哥的帮助哇!
不过我现在实现的效率是之前的基本上是30倍以上!
17#
 楼主| 发表于 2008-1-21 15:53:38 | 只看该作者

已经搞定!

因为数据中有可能有完全重复的数字,
所以用14楼的思路会出现漏掉的情况
解决的思路是将数据排序,然后读入数组(当然也可以不用,我是用VB先排序EXCEL数据然后数组直接读入EXCEL表格的数据),然后分区域对比,满足需求
10000条数据完成对比用时间9秒左右
等整理好了放上来大家参考!
16#
发表于 2008-1-17 04:44:59 | 只看该作者
学习学习, :)
15#
发表于 2008-1-17 04:44:41 | 只看该作者
好复杂,学习一下
14#
 楼主| 发表于 2008-1-14 11:37:47 | 只看该作者
原帖由 Victor_Duane 于 2008-1-13 13:36 发表
更正一下:需要用到ABS函数
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_P ...


感谢VICTOR 的回复
目前我就是用查询来实现的!

但是我的想法是查询的效率还是不够高呀!

我的思路是,拿数据1的对比来说(假设对比相等,而不是对比差值)!比如说对比第一条纪录时将数据1按照升序排列
用第一条纪录对比所有纪录中间的一条如果比第一条大那么抛弃后1/2所有纪录,然后将第一条与前1/2数据的1/2位置的纪录数据对比,如果小则再抛弃其前1/2
依次类推
100000条数据 最多对比16次即刻得到结果,如果用遍历数据的话那么需要进行100000^2-100000次至少!!

100000/2 =50000
50000/2=25000
25000/2=12500
12500/2=6250
6250/2=3125
3125/2=约1563
718
390
195
97
48
24
12
6
3
1
13#
发表于 2008-1-13 13:47:39 | 只看该作者
其实我不太明白楼主想干什么,只是提供一个思路,相信楼主自己可以做的更加的完善
12#
发表于 2008-1-13 13:40:57 | 只看该作者
VD,改过后的查询结果还是和楼主自己原来的不一样哦
11#
发表于 2008-1-13 13:36:42 | 只看该作者
更正一下:需要用到ABS函数
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 (((Abs([aft_process].[数据1]-[aft_process_1].[数据1]))<0.03) AND ((Abs([aft_process].[数据2]-[aft_process_1].[数据2]))<0.03) AND ((Abs([aft_process].[数据3]-[aft_process_1].[数据3]))<20) AND (([aft_process].[编号]-[aft_process_1].[编号])<>0));
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, 2025-1-10 02:14 , Processed in 0.099275 second(s), 35 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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