Поиск наиболее популярного значения в массиве при запросе

Есть таблица, в которой одному значению из колонки parent может соответствовать несколько повторяющихся значений из колонки child.

select parent, array_agg(child) as children
  from some_table
 group by parent

Результатом данного запроса для какого-то случайного из родителей может быть массив типа:
[Алексей, Алексей, Дмитрий, Иван, Иван, Иван].

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

Т.к. для каждого parent может быть разное количество строк child не нашёл способа решить данную проблему в рамках запроса. Помогите, пожалуйста, если кто сталкивался с чем то подобным.


Ответы (1 шт):

Автор решения: Novitskiy Denis

Можно воспользоваться INNER JOIN LATERAL для того, чтобы в подзапросе найти топ 1 имя для этого родителя и затем вывести в селект.

Вот примерный код запроса

select distinct s1.parent, s3.child
from some_table s1 
INNER JOIN LATERAl (select s2.parent, s2.child, count (s2.child) cnt
from some_table s2
where s2.parent=s1.parent
group by s2.parent, s2.child
order by cnt desc
limit 1) s3 on s1.parent=s3.parent

Тут фиддл

→ Ссылка