PostgreSQL array_agg порядок для оконных функций

Ответ на мой вопрос был почти здесь: PostgreSQL array_agg order

За исключением того, что я хотел array_agg над оконной функцией:

 select distinct c.concept_name, 
        array_agg(c2.vocabulary_id||':'||c2.concept_name 
                  order by c2.vocabulary_id, c2.concept_name) 
            over (partition by ca.min_levels_of_separation), 
        ca.min_levels_of_separation
 from concept c
 join concept_ancestor ca on c.concept_id = ca.descendant_concept_id 
      and max_levels_of_separation > 0
 join concept c2 on ca.ancestor_concept_id = c2.concept_id 
 where 
 c.concept_code = '44054006'
 order by min_levels_of_separation;

Так что, возможно, это будет работать в какой-то будущей версии, но я получаю эту ошибку

 ERROR:  aggregate ORDER BY is not implemented for window functions
 LINE 2: select distinct c.concept_name, array_agg(c2.vocabulary_id||...
                                    ^

Я, вероятно, должен выбрать из подзапроса, как первый ответ на приведенный выше вопрос предлагает. Я надеялся на что-то такое же простое, как порядок (во втором ответе на этот вопрос). Или, может быть, я просто ленюсь о запросе и должен делать group by вместо select distinct,

Я попытался выставить заказ в оконной функции (over (partition by ca.min_levels_of_separation order by c2.vocabulary_id, c2.concept_name)), но я получаю такие повторяющиеся строки таким образом:

 "Type 2 diabetes mellitus";"{"MedDRA:Diabetes mellitus"}";1
 "Type 2 diabetes mellitus";"{"MedDRA:Diabetes mellitus","MedDRA:Diabetes mellitus (incl subtypes)"}";1
 "Type 2 diabetes mellitus";"{"MedDRA:Diabetes mellitus","MedDRA:Diabetes mellitus (incl subtypes)","SNOMED:Diabetes mellitus"}";1

(между прочим: http://www.ohdsi.org/ если вам интересно, где я получил таблицы медицинского словаря)

2 ответа

Решение

Да, это выглядит так, как будто я был тупоголовым и не нуждался в оконной функции. Это похоже на работу:

 select  c.concept_name, 
         array_agg(c2.vocabulary_id||':'||c2.concept_name 
                   order by c2.vocabulary_id, c2.concept_name), 
         ca.min_levels_of_separation
 from concept c
 join concept_ancestor ca on c.concept_id = ca.descendant_concept_id 
      and max_levels_of_separation > 0
 join concept c2 on ca.ancestor_concept_id = c2.concept_id
 where c.concept_code = '44054006'
 group by c.concept_name, ca.min_levels_of_separation
 order by min_levels_of_separation

Я не приму мой ответ некоторое время, так как он просто избегает вопроса вместо того, чтобы фактически отвечать на него, и у кого-то может быть что-то более полезное, чтобы сказать по этому вопросу.

Как это:

select distinct c.concept_name, 
    array_agg(c2.vocabulary_id||':'||c2.concept_name ) over (partition by ca.min_levels_of_separation  order by c2.vocabulary_id, c2.concept_name), 
    ca.min_levels_of_separation
from concept c
join concept_ancestor ca on c.concept_id = ca.descendant_concept_id 
  and max_levels_of_separation > 0
join concept c2 on ca.ancestor_concept_id = c2.concept_id 
where 
c.concept_code = '44054006'
order by min_levels_of_separation;
Другие вопросы по тегам