Mảng json của bạn bị rối, chẳng hạn như @posz đã nhận xét . Sẽ phải là:
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]}');
Truy vấn của bạn cũng bị xoắn theo nhiều cách. Sẽ hoạt động như thế này trong pg 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;
Trong pg 9.4 sắp tới chúng ta có thể đơn giản hóa với json_array_elements_text()
mới (cũng ít bị lỗi hơn trong dàn diễn viên):
SELECT t.id, avg(x::numeric) AS avg_speed
FROM tbl t
, json_array_elements_text(speed_data->'speed') x
GROUP BY t.id;
Thêm chi tiết:
Ngoài ra:Sẽ hiệu quả hơn nhiều nếu lưu trữ dữ liệu này dưới dạng mảng thuần túy (numeric[]
, không phải json
) hoặc trong một lược đồ chuẩn hóa để bắt đầu.