2014-12-08 5 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

어떤 결과가 나타 납니까? 당신의 값이 int로 변환되고 있습니까? –

+1

이 작업을 수행 할 수 없습니다. 의미 상 무효 인 json이 있습니다. json 객체에서 모든 키는 한 번만 나타납니다. 이 json은 문법적으로 유효하지만, 결과 (파싱 후)에서 마지막 쌍 (키' "speed"') 만 보입니다. – 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.

을 곧 페이지에서 우리는 새로운 json_array_elements_text() (또한 더 적은 오류가 발생하기 쉬운 캐스트에서)로 단순화 할 수 있습니다 9.4

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

자세한 내용 :

16,: 그것은 훨씬 더 효율적 일반 배열 (numeric[]하지 json) 또는로 시작하는 정규화 된 스키마로이를 저장하는 것입니다.