Я реализовал это некоторое время назад с понижением частоты на лету для некоторых графиков. Недостаток в том, что старший теряет разрешение, но я считаю, что это приемлемо для вас. А если вас интересуют пики, вы можете указать значения max, avg и min.
Алгоритм не так уж сложен. Если у вас есть 5 образцов в секунду и вы хотите удерживать эту гранулярность в течение, возможно, часа, вы должны хранить 5 * 60 * 60 = 18000 образцов для этого часа.
В течение дня вы можете снижаться до 1 выборки каждые 5 секунд, уменьшая количество в 25 раз. Затем алгоритм будет запускаться каждые 5 секунд и вычислять медиану, минимум и максимум из 5 секунд, которые прошли 24 несколько часов назад. Результаты в 12 * 60 * 23 = 16560 больше образцов в день, и если вы храните
Далее я рекомендую пробу каждую минуту, уменьшая количество на 12, возможно, на две недели, так что у вас есть 60 * 24 * 13 = 18720 проб на данные за две недели.
Особое внимание следует уделить хранению данных в БД. Чтобы получить максимальную производительность, вы должны убедиться, что данные одного датчика хранятся в одном блоке в базе данных. Если вы используете, например, PostgreSQL, вы знаете, что один блок имеет длину 8192 байта, и в одном блоке не хранятся две записи. Предполагая, что одна выборка имеет длину 4 байта, и учитывая издержки на строку, я могу добавить 2048 минус несколько выборок в одном блоке. Учитывая самое высокое разрешение, это 2040/5/60 = 6 минут данных. Может быть, сейчас хорошая идея всегда добавлять 6 минут сразу, а может быть 5, чтобы они были просто фиктивными для обновления в более поздние минуты, чтобы запросы могли быстрее извлекать блоки одного датчика.
По крайней мере, я бы использовал разные таблицы для разной степени детализации сенсора.