2016-03-14 1 views
0

Ответ на мой вопрос был почти здесь: PostgreSQL array_agg orderPostgreSQL порядок array_agg для оконных функций

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

ответ

0

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

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 

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

+0

выглядит совершенно нормально на быстрый взгляд – AlexM

0

так:

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; 
+0

К сожалению, я должен был сказать, я пробовал. Это дает мне несколько повторяющихся рядов. Я отредактирую вопрос, чтобы показать, что я имею в виду (не могу отформатировать его в комментарии). – Sigfried