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

Ответ на мой вопрос был почти здесь: 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/, если вам интересно, откуда я взял медицинские словарные таблицы)


person Sigfried    schedule 14.03.2016    source источник


Ответы (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

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

person Sigfried    schedule 14.03.2016
comment
Выглядит совершенно нормально на беглый взгляд - person AlexM; 15.03.2016

нравится :

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;
person Mesbah Gueffaf    schedule 14.03.2016
comment
Извините, я должен был сказать, что пробовал это. Это дает мне повторяющиеся строки. Я отредактирую вопрос, чтобы показать, что я имею в виду (не могу отформатировать его в комментарии). - person Sigfried; 14.03.2016