By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
Help with an interesting Postgres question: Why isn't an Index Only Scan used on a partition accessed via the parent table?.
CREATE TABLE data (id int PRIMARY KEY, age text);
INSERT INTO data VALUES
(1, '1-5 years')
, (2, '6-10')
, (3, '11')
, (4, '18-21 years') -- get fraction
;
CREATE TABLE
INSERT 0 4
-- as single expression
SELECT *, CASE
WHEN age ~ ' ' THEN (split_part(age, '-', 1)::float8 + split_part(split_part(age, ' ', 1), '-', 2)::float8) / 2
WHEN age ~ '-' THEN (split_part(age, '-', 1)::float8 + split_part( age , '-', 2)::float8) / 2
ELSE age::float8
END AS avg_age
FROM data
ORDER BY id; -- optional
id | age | avg_age |
---|---|---|
1 | 1-5 years | 3 |
2 | 6-10 | 8 |
3 | 11 | 11 |
4 | 18-21 years | 19.5 |
SELECT 4
-- with aggregation
SELECT id, age, avg(age_bound) AS avg_age
FROM (
SELECT *, string_to_table(split_part(age, ' ', 1), '-')::float8 AS age_bound
FROM data
) sub
GROUP BY id, age
ORDER BY id; -- optional
id | age | avg_age |
---|---|---|
1 | 1-5 years | 3 |
2 | 6-10 | 8 |
3 | 11 | 11 |
4 | 18-21 years | 19.5 |
SELECT 4