I have a column called "value" in my "answers" table.
| value |
|---------|
| [1,2] |
| [1] |
| [1,2,3] |
The type of "value" is "jsonb".
I want to get the average value of each array in each row:
SELECT avg(value) AS avg_value
FROM answers
But this doesn't work because avg() is not a jsonb function. I've tried:
SELECT avg(value::integer[]) as avg_value
FROM answers
i.e. tried to cast the jsonb arrays into integer arrays and then taking the avg, but I get the following error: "cannot cast type jsonb to integer[]. null".
Any ideas?
1 Answer 1
You need to unnest the JSON array with jsonb_array_elements
.
You can do this in a correlated subquery:
SELECT
(SELECT AVG(value::decimal(18,5))
FROM jsonb_array_elements(value)
) AS avg_value
FROM answers;
-
Could you please explain what the decimal(18,5) does? Specifically the numbers 18 and 5.user236222– user2362222021年07月30日 12:26:41 +00:00Commented Jul 30, 2021 at 12:26
-
Precision and scale. I just picked anything, you could convert to
decimal(5,2)
if you like, or evenfloat
Charlieface– Charlieface2021年07月30日 12:28:15 +00:00Commented Jul 30, 2021 at 12:28 -
Thank you for your help!user236222– user2362222021年07月30日 12:41:11 +00:00Commented Jul 30, 2021 at 12:41