我正在构建一个 java 应用程序,它将从 MySQL 数据库中查找重复事件。
我的表格如下所示:
| **EventID** | **Device** | **Level** | **TimeStamp** |
(id) 001 40% 1/18/2016 4:50:20
事件类似于:设备 001 在 1/18/2016 4:50:20 变为级别 40%
>如何查找以下事件:
设备 A 在每个工作日的 7:30:00左右级别调至 36%;
或者
设备 B 在每周三晚上 15:30:00左右 恢复到 90% 水平;
请注意, Activity 的级别和时间并不是最终的(这就是它的原因)。 MySQL有办法查找事件并返回时间间隔和级别间隔吗?因为我知道如果我运行以下内容,性能会很差:
For (all devices) {
For (time 00:00:00 to time 23:59:59) {
For (level 0% to 100%) {
//SELECT based on level intervals and time intervals
}
}
}
上述方法也会有偏差,因为这里预设了时间和级别间隔。例如,如果事件总是在 7:40 左右发生,而我在 7:20 到 7:40 之间进行间隔,则我不会找到那么多事件。级别相同。
最佳答案
MySQL 没有直接的工具。
首先,确定哪种类型的精度对您的应用有意义。例如,“大约40%”是否意味着39.9至40.1?还是35到45?或者是其他东西?时间也是如此——20 分钟的窗口足够精确吗?或者应该是 1 分钟还是 1 小时。
然后折叠。也就是说,“每日”忽略当天和一天中不同时间的总和。对于“工作日”,忽略周末。
双和... FLOOR(value/10) 为您提供一个对于每个常规 10 单位范围都不同的整数。 FLOOR((value+5)/10) 给出一个 10 个单位间隔的整数,但移动了 5 个单位。丢失的?让我从另一个角度来看待这个问题......
如果有一组读数 17,18,18,19,19,19,20,21,22,23。按第一层分组将给出
- 整数=1,计数=6 (17..19),中点=15;和
- 整数=2,计数=4 (20..23),中点=25。
二楼将所有这些放在一起并找到
- 计数=10,中点=20。
最大计数为 10,对应于中点 20。那么,您不是说存在一个“大约 20”的簇,而不是两个簇,一个大约 15,另一个大约 25?
无论如何,这就是我发现集群的方式。我会只选择前几个计数,丢弃其余的,并组合任何重叠或相邻的簇。
上面的“单位”可以是百分比、一天中的时间、一周中的天数,任何有意义的东西。
要拍摄多少个“集群”?好吧,我对 80-20 rule 着迷。它预测 80% 的项目将聚集在 20% 的单元周围。鉴于此,在 20% 之后停止扫描中点。
如果您第一次弄错了“精度”,请更改它并重新开始。
关于java - MySQL 重复事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34864794/