Я не уверен, что cidr
сделает это намного более эффективным, потому что вам все еще нужно агрегировать. Вы можете создать адрес типа C, используя функции массива:
select array_to_string((regexp_split_to_array(netaddr, '\.'))[1:3], '.') as typec,
count(*)
from t
group by typec;
или используя регулярные выражения:
select regexp_replace(netaddr, '(^[0-9]+[.][0-9]+[.]+[0-9]).*$', '\1') as typec,
count(*)
from t
group by typec