MySQL Datetime - идентификация пробелов - PullRequest
1 голос
/ 03 июня 2011

Я проектирую базу данных MySQL, которая будет содержать поминутные данные, собираемые из удаленного источника.

Я планирую, чтобы таблица данных содержала поле даты и времени, и поэтому у меня может быть 3 месяца данных каждыйстрока, представляющая значения в каждую минуту.

Как я могу легко определить пробелы в данных?Должен ли я даже использовать datetime?

Я буду использовать PHP5 для самого приложения.

Спасибо, Джим

Ответы [ 2 ]

0 голосов
/ 03 июня 2011

Выявление пробелов - интересная проблема. Наилучший подход будет зависеть от размера пробела, но здесь есть другой способ его устранения, который может быть лучше, если пробелы достаточно велики по сравнению с количеством записей, которые у вас есть.

Используйте функцию агрегации MySQL в запросе для подсчета количества записей для набора сегментов. По размеру сегменты должны быть похожи на те виды пробелов, которые вас интересуют. Предполагая, что вас интересуют пропуски, приближающиеся к дню или около того, я бы сделал что-то вроде этого:

SELECT TO_DAYS(my_timestamp), COUNT(*)
FROM my_table
GROUP BY TO_DAYS(my_timestamp)

Это вернет связь между днями и временем. Я бы сделал все остальное на языке, таком как Perl или Java (или даже R, см. Позже), где я могу обрабатывать данные.

Техника, которую я бы использовал, была бы проверкой разницы между наблюдаемой частотой (количеством) и ожидаемой частотой, которая будет представлять собой общее количество записей, деленное на дневной диапазон. Ожидаемая частота для каждого дня будет примерно такой:

SELECT (SELECT COUNT(*) FROM my_table) / 
        ((SELECT TO_DAYS(MAX(my_timestamp)) FROM my_table) - 
         (SELECT TO_DAYS(MIN(my_timestamp)) FROM my_table) + 1)

Теперь для каждого сегмента (помня, что в первом результате полностью пропущенные дни будут просто не возвращаться, а не возвращаться как счетчик нуля - вам нужно рассматривать их, как если бы они были равны нулю, вы можете использовать статистический test, критерий хи-квадрат, для оценки вероятности того, что это шанс (подробнее см. http://en.wikipedia.org/wiki/Pearson%27s_chi-square_test). Расчет, в основном ((ожидаемый - наблюдаемый) ^ 2 / ожидаемый). Это оценка вероятность отклонения.

Если вам необходимо выяснить, какие сегменты имеют низкое значение в выборках, установите разумное пороговое значение для этого вычисленного значения и найдите сегменты, в которых значение превышает пороговое значение. Может потребоваться небольшой эксперимент, чтобы найти подходящее значение, но это разумный способ определения пробелов.

0 голосов
/ 03 июня 2011

Я бы дал каждой строке уникальную последовательную ссылку (1,2,3 ...), а затем сделал бы самообъединение для таблицы

...from mytable t1 join mytable t2 where (t1.ref+1)=t2.ref

В зависимости от того, как вы храните даты, вы можетевычтите их (так или иначе) и определите, есть ли разрыв.Оберните все это в запрос, который извлекает строки, в которых есть пробел.

Возможно, вы захотите сохранить даты в секундах от определенной даты начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...