Вы можете использовать агрегацию с выражением case
для определения группы:
select
code,
count(*) frequency,
case
when age >= 0 and age < 10 then '0-10'
when age >= 10 and age < 20 then '10-20'
end age_range
from mytable
group by code, age_range
order by age_range
Если вы хотите использовать наиболее частый код для каждой возрастной группы, тогда вы можете использовать row_number()
поверх запроса :
select code, frequence, age_range
from (
select
t.*,
row_number() over(partition by age_range order by frequency desc) rn
from (
select
code,
count(*) frequency,
case
when age >= 0 and age < 10 then '0-10'
when age >= 10 and age < 20 then '10-20'
end age_range
from mytable
group by code, age_range
) t
) t
where rn = 1
Или еще лучше:
select code, frequence, age_range
from (
select
code,
count(*) frequency,
case
when age >= 0 and age < 10 then '0-10'
when age >= 10 and age < 20 then '10-20'
end age_range,
row_number() over(partition by min(age) order by count(*) desc) rn
from mytable
group by code, age_range
) t
where rn = 1