2017-01-03 31 views
1

在一个包含测量和状态数据的大型数据库中,我打算减少数据而不会丢失太多信息。我研究了几个例子,但是我的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 | 

感谢您的支持。

+0

你的第二个要求是不清楚的。你能通过使用示例数据显示你的意思吗? –

+0

记录数与加入操作无关。但我真的不认为你需要一个。将要保留的记录复制到另一个表并删除原始数据可能会更容易。 – Shadow

+0

第二步是否清除了预期的结果? – Xcoder

回答

0

对于第一个查询,如果您想在聚合后获得完整记录,则需要做比您建议的更多的工作。一种方法是做一个额外的加入:

SELECT t1.* 
FROM filelog t1 
INNER JOIN 
(
    SELECT TIMESTAMP, DEVICE, READING, MAX(VALUE) AS VALUE 
    FROM filelog 
    GROUP BY TIMESTAMP, DEVICE, READING 
) t2 
    ON t1.TIMESTAMP = t2.TIMESTAMP AND 
     t1.DEVICE = t2.DEVICE AND 
     t1.READING = t2.READING AND 
     t1.VALUE  = t2.VALUE 
+0

不错,但有什么区别?我必须做MAX(CAST(VALUE AS DECIMAL)为了在2016-03-27 10:34:05有正确的数据最大值,但是这并不改变文件日志本身的数据不是吗? – Xcoder

+0

经过进一步的研究,我意识到这个答案是错误的,它报告没有重复的记录,要求的是一个声明,它永久地从数据库中删除重复报告,并用最大值替换它们。 – Xcoder