2017-01-03 2 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 *,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

Смежные вопросы