Я не пишу весь запрос (который включает в себя CTE, это немного долго), но в итоге у меня есть такой запрос:
select
ARRAY_TO_STRING((select sector from unnest(place)),"") as sector,
[struct(array_agg(
(case
when age <= 25 then "18-25"
when age >= 26 and age <= 35 then "26-35"
when age >= 36 and age <= 45 then "36-45"
when age >= 46 and age <= 55 then "46-55"
when age >= 56 and age <= 66 then "56-65"
when age >= 66 and age <= 75 then "66-75"
else "75+"
end)) as age_range)] as ranges,count(*) from males
group by sector
который дает мне этот вывод:
Row sector ranges.age_range f0_
1 Los Dominicos 46-55 5645
56-65
56-65
46-55
46-55
36-45
36-45
26-35
26-35
26-35
66-75
66-75
66-75
46-55
56-65
66-75
66-75
56-65
66-75
26-35
56-65
.
.
.
Я хотел бы сгруппировать также по диапазонам, но когда я это делаю, я получаю следующую ошибку:
Column ranges contains an aggregation function, which is not allowed in GROUP BY
Я хочу получить что-то вроде этого:
Row sector ranges.age_range f0_
1 Los Dominicos 18-25 5645
26-35 6846
36-45 79621
46-55 3215
56-65 3121
66-75 1324
75+ 160
Эти значения в столбце f0_ должны быть количеством людей, принадлежащих Los Dominicos и входящих в каждый возрастной диапазон.
Как я могу этого добиться?
Обновлено: я добавляю часть CTE, потому что я думаю, что есть что-то, что я забыл добавить сюда.
...
las_condes as (
select a.id, edad, t.nombre,t.gender,
[struct(array_agg(sector limit 1) as sector)] as places from all_tables a inner join
table t on a.id = t.id
where comuna = "las condes" and t.gender is not null
group by t.id,age,t.name,t.gender
),
female as (
select * from las_condes where gender = false
),
male as (
select * from las_condes where gender = true
)
...
Итак, sector действительно places.sector


Вам нужны два уровня агрегации:
select sector,
array_agg(struct(age_range, cnt))
from (select ARRAY_TO_STRING((select sector from unnest(place)), '') as sector,
(case when age <= 25 then '18-25'
when age >= 26 and age <= 35 then '26-35'
when age >= 36 and age <= 45 then '36-45'
when age >= 46 and age <= 55 then '46-55'
when age >= 56 and age <= 66 then '56-65'
when age >= 66 and age <= 75 then '66-75'
else '75+'
end) as age_range, count(*) as cnt
from males m
group by sector, age_range
) m
group by sector;
@PedroPabloSeverinHonorato . . . В вашем коде есть выражение для sector. Я добавил его сюда.
Вы правы ... извините, я пропустил это, и спасибо за ваш ответ
Привет @Гордон Линофф. Я попробовал ваш ответ, но он не распознает слово
sectorвнутри второгоselect. Я также добавил часть CTE, которую забыл добавить, и я думаю, что это может быть полезно. Пожалуйста, дайте мне знать, если нужна дополнительная информация :)