2017-01-25 6 views
0

Я использую postgres (RDS) для хранения данных временных рядов.Postgresql временной интервал

Скажем, мои данные выглядят следующим образом:

  • метки времени: (индекс и ключевые раздела)
  • Источник: Index Integer
  • данных: Binary JSON содержит данные
timestamp   | source | data 
---------------------+----------+------------------ 
2017-01-24 19:24:41 | 1  | { some jsonb } 
2017-01-24 19:25:41 | 1  | { some jsonb } 
2017-01-24 19:25:41 | 2  | { some jsonb } 
2017-01-24 19:26:41 | 3  | { some jsonb } 
2017-01-24 19:32:41 | 1  | { some jsonb } 
2017-01-24 19:33:41 | 2  | { some jsonb } 
2017-01-24 19:45:41 | 3  | { some jsonb } 
2017-01-24 19:50:41 | 1  | { some jsonb } 
2017-01-24 19:56:41 | 1  | { some jsonb } 
2017-01-24 20:01:41 | 1  | { some jsonb } 

Я бы хотел для сортировки данных по source и для разделения данных по интервалу, скажем, на 15 минут. Я также хотел бы round время разделения его на интервал.

До сих пор я получил

SELECT date_trunc('hour', timestamp) + date_part('minute', timestamp)::int/15 * interval '15 min' AS fifteen_minutes, data 
FROM MY_TABLE 
where source=1 
GROUP BY data, fifteen_minutes 
ORDER BY fifteen_minutes desc 

Который возвращает

fifteen_minutes  | source | data 
---------------------+----------+------------------ 
2017-01-24 19:15:00 | 1  | { some jsonb } 
2017-01-24 19:15:00 | 1  | { some jsonb } 
2017-01-24 19:30:00 | 1  | { some jsonb } 
2017-01-24 19:45:00 | 1  | { some jsonb } 
2017-01-24 19:45:00 | 1  | { some jsonb } 
2017-01-24 20:00:00 | 1  | { some jsonb } 

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

В идеале я хотел бы получить: (один результат на интервал)

fifteen_minutes  | source | data 
---------------------+----------+------------------ 
2017-01-24 19:15:00 | 1  | { some jsonb } 
2017-01-24 19:30:00 | 1  | { some jsonb } 
2017-01-24 19:45:00 | 1  | { some jsonb } 
2017-01-24 20:00:00 | 1  | { some jsonb } 

Любая лучшая идея? Спасибо!

+1

Пожалуйста, пост ожидаемого вывода на основе приведенных выше данных – GurV

+2

Для одного источника и любого 15-минутного ведра, как вы решить, какое значение из «данных» использовать? –

+0

«ближайшее» значение для ex ' от '2017-01-24 19: 24: 41' или' 2017-01-24 19: 25: 41' => '19: 24: 41' ближе всех к 19: 15. В настоящее время код обрабатывает эту логику по карте, уменьшая результаты –

ответ

1
select distinct on (fifteen_minutes, source) 
    fifteen_minutes, source, data 
from (
    select 
     to_timestamp((extract(epoch from timestamp)/(15 * 60))::int * 15 * 60) as fifteen_minutes, 
     data, timestamp 
    from t 
) t 
order by 
    fifteen_minutes, source, 
    abs(extract(epoch from timestamp) - extract(epoch from fifteen_minutes)) 
+0

Спасибо !!!! Clodoaldo Neto !!! –