Выборка с прореживанием по дате

twistfire
Дата: 20.04.2015 22:03:02
Доброго времени суток.

суть задачи - "проредить" данные, записанные в таблицу с нужным интервалом времени "прореживания" (например 10 мин).
(есть поле data_date timestamp)

в таблицу пишутся данные от датчика (ретроспективно). Может писаться неравномерно по времени - например за час может быть 10 значений, а может и не быть вовсе, а потом и все 100 значений за следующий час..

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

Как сделать это шустрее и чтобы итоговые результаты запроса были максимально на равные промежутки времени разнесены?
т.е. скажем промежуток времени между соседними записями был максимально близок к указанному интервалу (10 мин например).
(в таблице несколько миллионов записей и их число постоянно растет)
p2.
Дата: 21.04.2015 00:22:05
twistfire
максимально на равные промежутки времени разнесены
Если исходить из оптимальной минимизации ско по скользящей сетке, то эта задача на миллионах быстро не решается.
Исходить из жесткости критерия "не меньше", то здесь упрощенный start of group через оконные функции или рекурсию.
Более тривиальное, но при достаточной частоте событий малоотклоняющееся от оптимума решение - элементарная группировка по округлению к десяти минутам.
LeXa NalBat
Дата: 22.04.2015 13:39:53
> Как сделать это шустрее
При наличии индекса по data_date попробуйте идею Быстрый подсчет distinct values по индексированным полям, Loose indexscan. Только вам нужно будет заменить условие "WHERE col > t.col" на "WHERE col > t.col + ХХ минут".

> чтобы итоговые результаты запроса были максимально на равные промежутки времени разнесены
А вот с этим вижу проблему. Разные комбинации выбираемых точек придется проверить. Какая из них "максимально равно разнесенная". Кстати, что это формально означает.