Для этого вы можете использовать Postgres 'типы диапазонов вместе с оператором удержания (@>
):
select r.score_range, count(*)
from (values
('0-20', '[0, 20]'::int4range),
('15-50', '[15, 50]'::int4range),
('25-*', '[25,]'::int4range)
) r(score_range, rg)
left join mytable t on r.rg @> t.score
group by r.score_range
'[0, 20]'::int4range
представляет диапазон целых чисел для 0
(включительно) до 20
(включительно). '[25,]'::int4range
представляет диапазон от 25
(включительно) до бесконечности. Если вам нужны исключительные диапазоны, вы можете использовать круглые скобки (()
) вместо квадратных скобок ([]
).