В большой базе данных с данными измерений и состояния я намерен сократить данные, не теряя много информации. Я изучил несколько примеров, но мои 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 *,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