在一个包含测量和状态数据的大型数据库中,我打算减少数据而不会丢失太多信息。我研究了几个例子,但是我的SQL技巧似乎太局限了,无法成功......MySQL:通过删除/聚合重复项和常量值来清理数据
表中有数百万的数据。该表的定义是
TIMESTAMP TIMESTAMP, DEVICE varchar(32), TYPE varchar(32), EVENT varchar(512), READING varchar(32), VALUE varchar(32), UNIT varchar(32)
一些示例数据。全台有许多不同的设备和阅读应该各自单独处理:
+---------------------+----------+------+---------+---------+-------+------+
| TIMESTAMP | DEVICE | TYPE | EVENT | READING | VALUE | UNIT |
+---------------------+----------+------+---------+---------+-------+------+
| 2016-03-27 10:17:45 | KNX_428c | KNX | 49 mA | state | 49 | mA |
| 2016-03-27 10:19:45 | KNX_428c | KNX | 47 mA | state | 47 | mA |
| 2016-03-27 10:21:44 | KNX_428c | KNX | 50 mA | state | 50 | mA |
| 2016-03-27 10:23:44 | KNX_428c | KNX | 50 mA | state | 50 | mA |
| 2016-03-27 10:23:44 | KNX_428c | KNX | 50 mA | state | 50 | mA |
| 2016-03-27 10:25:44 | KNX_428c | KNX | 50 mA | state | 50 | mA |
| 2016-03-27 10:25:44 | KNX_428c | KNX | 50 mA | state | 50 | mA |
| 2016-03-27 10:27:44 | KNX_428c | KNX | 50 mA | state | 50 | mA |
| 2016-03-27 10:27:44 | KNX_428c | KNX | 50 mA | state | 50 | mA |
| 2016-03-27 10:29:44 | KNX_428c | KNX | 50 mA | state | 50 | mA |
| 2016-03-27 10:31:44 | KNX_428c | KNX | 50 mA | state | 50 | mA |
| 2016-03-27 10:31:44 | KNX_428c | KNX | 47 mA | state | 47 | mA |
| 2016-03-27 10:33:44 | KNX_428c | KNX | 50 mA | state | 50 | mA |
| 2016-03-27 10:33:44 | KNX_428c | KNX | 50 mA | state | 50 | mA |
| 2016-03-27 10:34:04 | KNX_428c | KNX | 136 mA | state | 136 | mA |
| 2016-03-27 10:34:04 | KNX_428c | KNX | 165 mA | state | 165 | mA |
| 2016-03-27 10:34:05 | KNX_428c | KNX | 136 mA | state | 136 | mA |
| 2016-03-27 10:34:05 | KNX_428c | KNX | 107 mA | state | 107 | mA |
| 2016-03-27 10:34:05 | KNX_428c | KNX | 79 mA | state | 79 | mA |
| 2016-03-27 10:34:06 | KNX_428c | KNX | 50 mA | state | 50 | mA |
| 2016-03-27 10:34:29 | KNX_428c | KNX | 107 mA | state | 107 | mA |
| 2016-03-27 10:34:29 | KNX_428c | KNX | 136 mA | state | 136 | mA |
| 2016-03-27 10:34:30 | KNX_428c | KNX | 165 mA | state | 165 | mA |
| 2016-03-27 10:34:30 | KNX_428c | KNX | 139 mA | state | 139 | mA |
| 2016-03-27 10:34:30 | KNX_428c | KNX | 107 mA | state | 107 | mA |
| 2016-03-27 10:34:31 | KNX_428c | KNX | 51 mA | state | 51 | mA |
| 2016-03-27 10:34:44 | KNX_428c | KNX | 0 mA | state | 0 | mA |
| 2016-03-27 10:35:44 | KNX_428c | KNX | 0 mA | state | 0 | mA |
| 2016-03-27 10:37:44 | KNX_428c | KNX | 0 mA | state | 0 | mA |
| 2016-03-27 10:37:44 | KNX_428c | KNX | 0 mA | state | 0 | mA |
| 2016-03-27 10:39:43 | KNX_428c | KNX | 0 mA | state | 0 | mA |
| 2016-03-27 10:41:43 | KNX_428c | KNX | 0 mA | state | 0 | mA |
| 2016-03-27 10:43:43 | KNX_428c | KNX | 0 mA | state | 0 | mA |
| 2016-03-27 10:45:43 | KNX_428c | KNX | 0 mA | state | 0 | mA |
| 2016-03-27 10:47:43 | KNX_428c | KNX | 0 mA | state | 0 | mA |
| 2016-03-27 10:47:43 | KNX_428c | KNX | 0 mA | state | 0 | mA |
| 2016-03-27 10:49:43 | KNX_428c | KNX | 0 mA | state | 0 | mA |
我打算做两件事情:
- 总结了用相同的时间戳,设备值,使用最大读取()
- 删除连续的相同值,除了第一个和最后一个常数值序列。
我在组合select语句中实现的第一件事。但我不知道如何实际更改数据库。
SELECT *,MAX(VALUE) FROM filelog
GROUP BY TIMESTAMP,DEVICE,READING
对于第二步,我发现了几个例子,但他们总是结合重复在一个单一的记录,而不是在两个(第一和最后一个),我打算这样做。通常这些例子都适用于JOIN,我认为这对于数百万数据集来说是不可能的。
结果应符合如下:
| 2016-03-27 10:17:45 | KNX_428c | KNX | 49 mA | state | 49 | mA |
| 2016-03-27 10:19:45 | KNX_428c | KNX | 47 mA | state | 47 | mA |
| 2016-03-27 10:21:44 | KNX_428c | KNX | 50 mA | state | 50 | mA |
| 2016-03-27 10:33:44 | KNX_428c | KNX | 50 mA | state | 50 | mA |
| 2016-03-27 10:34:04 | KNX_428c | KNX | 136 mA | state | 165 | mA |
| 2016-03-27 10:34:05 | KNX_428c | KNX | 136 mA | state | 136 | mA |
| 2016-03-27 10:34:06 | KNX_428c | KNX | 50 mA | state | 50 | mA |
| 2016-03-27 10:34:29 | KNX_428c | KNX | 107 mA | state | 136 | mA |
| 2016-03-27 10:34:30 | KNX_428c | KNX | 165 mA | state | 165 | mA |
| 2016-03-27 10:34:31 | KNX_428c | KNX | 51 mA | state | 51 | mA |
| 2016-03-27 10:34:44 | KNX_428c | KNX | 0 mA | state | 0 | mA |
| 2016-03-27 10:49:43 | KNX_428c | KNX | 0 mA | state | 0 | mA |
感谢您的支持。
你的第二个要求是不清楚的。你能通过使用示例数据显示你的意思吗? –
记录数与加入操作无关。但我真的不认为你需要一个。将要保留的记录复制到另一个表并删除原始数据可能会更容易。 – Shadow
第二步是否清除了预期的结果? – Xcoder