Диапазоны столбцов содержат функцию агрегирования, которая не разрешена в GROUP BY при использовании CASE, массивов и структур

Я не пишу весь запрос (который включает в себя 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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
327
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужны два уровня агрегации:

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;

Привет @Гордон Линофф. Я попробовал ваш ответ, но он не распознает слово sector внутри второго select. Я также добавил часть CTE, которую забыл добавить, и я думаю, что это может быть полезно. Пожалуйста, дайте мне знать, если нужна дополнительная информация :)

Pedro Pablo Severin Honorato 15.12.2020 00:07

@PedroPabloSeverinHonorato . . . В вашем коде есть выражение для sector. Я добавил его сюда.

Gordon Linoff 15.12.2020 00:22

Вы правы ... извините, я пропустил это, и спасибо за ваш ответ

Pedro Pablo Severin Honorato 15.12.2020 00:24

Другие вопросы по теме