java - MySQL 重复事件

标签 java mysql sql database-design pattern-matching

我正在构建一个 java 应用程序,它将从 MySQL 数据库中查找重复事件。

我的表格如下所示:

| **EventID** | **Device** | **Level** | **TimeStamp** |
     (id)           001         40%     1/18/2016 4:50:20

事件类似于:设备 0011/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/

相关文章:

mysql - 保护特定对象 ID 不被 MySQL 删除

java - Jersey 客户端和 CXF 混淆(多部分问题)

java - 使用 php 单击提交按钮

java - 为什么我在 IntelliJ logcat View 中看不到任何错误?

MYSQL查询没有排序结果mix char

php - 存储在数据库中的csv字符串中带有后缀的Mysql搜索关键字

java - 哪种方法更适合加载 JDBC 驱动程序?

PHP:第二个查询不起作用

mysql - 检查单个列的多个值mysql

sql - 如何在一个查询中使用两个 COUNT