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;