2014-12-08 4 views
0

У меня есть таблица со столбцом данных JSON, из которого я хочу извлечь информацию. В частности, я просто хочу получить среднее значение.Среднее вычисление по столбцу JSON

Пример того, что у меня есть:

id  speed_data 
391982 [{"speed":1.3,"speed":1.3,"speed":1.4,"speed":1.5... 
391983 [{"speed":0.9,"speed":0.8,"speed":0.8,"speed":1.0... 

Пример того, что я хочу:

id  speed_data 
391982 1.375 
391982 0.875 

Любые предложения о том, как получить этот запрос на работу?

select t.*, avg(x.speed) 
from tbl t, 
    json_array_elements(a->'speed') x 
order by random() 
limit 1 
+0

Какой результат вы получаете? Преобразуются ли ваши значения в ints? –

+1

Вы не сможете этого сделать. У вас семантически недействительный json: в объекте json каждый ключ должен появляться только один раз; этот json синтаксически действителен, но только последние пары (с ключом «скорость») будут видны в результатах (после разбора). – pozs

ответ

1

Ваш массив json перепутался, например @posz commented. Должно быть:

CREATE TABLE tbl (id int, speed_data json); 

INSERT INTO tbl VALUES 
    (391982, '{"speed":[1.3,1.3,1.4,1.5]}') 
, (391983, '{"speed":[0.9,0.8,0.8,1.0]}'); 

Ваш запрос скручен разными способами. Будет работать, как это в пг 9,3:

SELECT t.id, avg(x::text::numeric) AS avg_speed 
FROM tbl t 
    , json_array_elements(speed_data->'speed') x 
GROUP BY t.id; 

SQL Fiddle.

В предстоящем пкг 9,4 можно упростить с новым json_array_elements_text() (также менее подвержены ошибкам в гипсе):

SELECT t.id, avg(x::numeric) AS avg_speed 
FROM tbl t 
    , json_array_elements_text(speed_data->'speed') x 
GROUP BY t.id; 

Дополнительная информация:

Помимо: Это было бы гораздо более эффективно хранить это в виде простого массива (numeric[], не json) или в нормализованной схеме, чтобы начать с.

Смежные вопросы