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