2016-03-15 6 views
0

Мой вопрос такой же, как тот, который был задан here, за исключением того, что выбранный ответ «предполагается, что вы хотите перезапустить скользящее среднее после каждого 15-минутного интервала». Что, если я этого не сделаю? То есть что, если я хочу другой скользящий средний для каждой строки и следующих пятнадцати минут строк?Перемещение окна/среднее на основе временных меток в PostgreSQL

+0

PG (до 9,5 в любом случае) не поддерживает это с помощью функции окна. См. Также http://stackoverflow.com/q/31396434/3304426 для соответствующего вопроса и обсуждения. – Patrick

+0

Это не обязательно должна быть функция окна, я только помечал ее так, потому что это звучало как возможное решение, но, по-видимому, это не так. –

ответ

1

Я хотел бы подойти к этому в качестве коррелированных подзапросов:

select t.*, 
     (select avg(t2.col) 
     from t t2 
     where t2.timestamp >= t.timestamp and 
       t2.timestamp < t.timestamp + interval '15 minute' 
     ) as future_15min_avg 
from t; 

Это является сложной задачей, чтобы сделать с функциями окна, так как размер окна может изменяться для каждой строки.

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

  • Вставьте каждую метку с его значением в таблице
  • Вставьте каждую временную метку плюс 15 минут в таблице со значением 0
  • Добавить индекс на метку времени
  • ли кумулятивный просуммировать по значениям
  • Используйте два соединение между исходной таблицей и таблицей получить сумму

Вы можете попробовать это с КТР, и пер формальность может быть в порядке. Однако, я думаю, индекс может быть важным для производительности. И коррелированный подзапрос, вероятно, хорош даже для нескольких сотен или тысяч строк, если у вас есть индекс в столбце времени.

+0

Да. Это или самосоединение. –

+0

Мне бы хотелось сделать самостоятельное объединение, но в таблице есть несколько миллионов записей, это совсем не быстро. Но я не уверен, что функция окна лучше. –

+0

"* Это сложно сделать с помощью оконных функций, потому что размер окна *" - теоретически нет, но, к сожалению, Postgres не позволяет указывать 'диапазон' на основе интервала, например. Oracle делает. –