其实,你的问题,归纳下来,只是在问,怎样 “每条 记录 都要找出对应一个小时前的记录来比较”。
多种方法!(假设你是用 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 客户端了,从数据库获取查询范围的数据过来本地,才本地查询!
什么服务器的 索引都不用改!又不影响服务器速度!挺好玩的!
其实,你的问题,归纳下来,只是在问,怎样 “每条 记录 都要找出对应一个小时前的记录来比较”。
多种方法!(假设你是用 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 客户端了,从数据库获取查询范围的数据过来本地,才本地查询!
什么服务器的 索引都不用改!又不影响服务器速度!挺好玩的!
假设设备自动为数字型,则计算参数1、参数2的环比变换用以下查询:
select 设备,DAY,参数1-Dlast("参数1","tbname","设备=" & 设备 & " and DAY<" & DAY) as 参数1环比变化值,参数2-Dlast("参数2","tbname","设备=" & 设备 & " and DAY<" & DAY) as 参数2环比变化值 from tbname
其他参数以此类推即可。
品茶兄,几年了,还是不摘手段的高手!
有经验 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 :