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