Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

VBA问题-如何实现找出参数变化的记录(比较有难度的且非常有用的功能)

秋日心情  发表于:2012-12-30 14:38:11  
复制

车间有多个设备,编号分别是100~149,都有5个参数描述设备的运行性能。设备每个小时过20分都会输出最近2个时段的参数值,如下图原始表:

如何对原始数据做处理,如找出设备100在10时相比9时参数1恶化15(%),参数3恢复4(%);设备101参数2恢复2(%);设备102在10时相比9时参数1恢复2(%),参数2恶化1(%),参数3恢复5(%),等等



我现在一直没有头绪,请各位老师帮忙看看,要如何实现,有代码或例子都行,万分感谢!!!

 

Top
dbaseIIIer 发表于:2012-12-31 05:31:59

其实,你的问题,归纳下来,只是在问,怎样  “每条 记录 都要找出对应一个小时前的记录来比较”。


多种方法!(假设你是用 ms sql 的)

select a.设备, a.day 

from 原始记录 a

left join 原始记录 b on a.设备=b.设备 and a.day=dateadd("h", 1, b.day)

这就完成了哦!

a 是当前的, b 表是 一个小时前的,当然用left join的好处是 有可能什么情况 找不到 一个小时前的记录


你就可以加上你的条件:

a.参数1 < b.参数1 * 0.85 and .... and ..... 


不过你要这样做之前,最好你的原始表  建立好索引 “设备+Day” 的!



方法二:


select a.设备, a.day 

from 原始记录 a, 原始记录 b

where a.设备=b.设备 and a.day=dateadd("h", 1, b.day)

再加上  and a.参数1 < b.参数1 * 0.85 and .... and ..... 


这方法不需要你建立索引,就是需要你内存大!



不过任何方法也好,其实最关键的,还是你的数据库设计! 

你经常要处理这个关联的话,你的时间戳,一定要改为 长整数!

每个记录保存的时候,就转化一下:

字段: timestp = Clng( Day) * 24 + hour(day)   => 关联数据就用 a.timestp = b.timestp+1

毕竟每次写入数据都要做乘数运算,还是拖慢速度的! 可以改为*32,这个乘数就会快一倍!


不过要乘数还是慢的了,最好就是把时间保存成为长整形!

如果你是用 mysql  的话,有个类型很好用的,就是 unix_timestamp!

字段: timestp = unix_time( day) 就可以了,    => 关联数据就用 a.timestp = b.timestp+ 3600


也许mssql 也有类似的类型吧,自己研究吧!因为效率问题,我没用 mssql 大概8年的了!



如果你没有索引,又想有这样快速的运行,又不想拖慢数据库的话,

查询分段,或者异步化数据才分析!


其中一种最好的方法就是 Access 客户端了,从数据库获取查询范围的数据过来本地,才本地查询!

什么服务器的 索引都不用改!又不影响服务器速度!挺好玩的!






dbaseIIIer 发表于:2012-12-31 05:32:00

其实,你的问题,归纳下来,只是在问,怎样  “每条 记录 都要找出对应一个小时前的记录来比较”。


多种方法!(假设你是用 ms sql 的)

select a.设备, a.day 

from 原始记录 a

left join 原始记录 b on a.设备=b.设备 and a.day=dateadd("h", 1, b.day)

这就完成了哦!

a 是当前的, b 表是 一个小时前的,当然用left join的好处是 有可能什么情况 找不到 一个小时前的记录


你就可以加上你的条件:

a.参数1 < b.参数1 * 0.85 and .... and ..... 


不过你要这样做之前,最好你的原始表  建立好索引 “设备+Day” 的!



方法二:


select a.设备, a.day 

from 原始记录 a, 原始记录 b

where a.设备=b.设备 and a.day=dateadd("h", 1, b.day)

再加上  and a.参数1 < b.参数1 * 0.85 and .... and ..... 


这方法不需要你建立索引,就是需要你内存大!



不过任何方法也好,其实最关键的,还是你的数据库设计! 

你经常要处理这个关联的话,你的时间戳,一定要改为 长整数!

每个记录保存的时候,就转化一下:

字段: timestp = Clng( Day) * 24 + hour(day)   => 关联数据就用 a.timestp = b.timestp+1

毕竟每次写入数据都要做乘数运算,还是拖慢速度的! 可以改为*32,这个乘数就会快一倍!


不过要乘数还是慢的了,最好就是把时间保存成为长整形!

如果你是用 mysql  的话,有个类型很好用的,就是 unix_timestamp!

字段: timestp = unix_time( day) 就可以了,    => 关联数据就用 a.timestp = b.timestp+ 3600


也许mssql 也有类似的类型吧,自己研究吧!因为效率问题,我没用 mssql 大概8年的了!



如果你没有索引,又想有这样快速的运行,又不想拖慢数据库的话,

查询分段,或者异步化数据才分析!


其中一种最好的方法就是 Access 客户端了,从数据库获取查询范围的数据过来本地,才本地查询!

什么服务器的 索引都不用改!又不影响服务器速度!挺好玩的!






dbaseIIIer 发表于:2012-12-31 05:40:30

数据库应用 差不多的例子

用查询建立考号示例 (二) http://www.accessoft.com/article-show.asp?id=5891


应用技术是  不join的两个表(同一个表,不同记录)的比较




煮江品茶 发表于:2012-12-31 11:23:57

假设设备自动为数字型,则计算参数1、参数2的环比变换用以下查询:
select 设备,DAY,参数1-Dlast("参数1","tbname","设备=" & 设备 & " and DAY<" & DAY) as 参数1环比变化值,参数2-Dlast("参数2","tbname","设备=" & 设备 & " and DAY<" & DAY) as 参数2环比变化值 from tbname

其他参数以此类推即可。



dbaseIIIer 发表于:2013-01-01 19:02:56

品茶兄,几年了,还是不摘手段的高手!


有经验 Access/VBA开发人都 知道,数据库查询速度最快顺序是

1. DBEngine(0)(0) 的 DAO查询

2. CurrentDB 的DAO查询

3. DLookup , DMax, DMin ..... 所有 Aggregate Function

4. ADO查询


你要这个同学每小时 多  50设备 * 5 个数据 * 2个(上下限条件) = 500个相对慢的查询?

里面还  每个设备  都发出 10个 查询相同记录 只是为了不同字段  的查询(所有 D函数 都不会有缓存的);

还  500个查询每个会独立建立一个对网络(不是本地数据库)的访问,每次握手,等待每一个访问结果!


 高手!总能让老板快点换电脑的高手!



总记录:5篇  页次:1/1 9 1 :