Поиск наиболее популярного значения в массиве при запросе
Есть таблица, в которой одному значению из колонки parent может соответствовать несколько повторяющихся значений из колонки child.
select parent, array_agg(child) as children
from some_table
group by parent
Результатом данного запроса для какого-то случайного из родителей может быть массив типа:
[Алексей, Алексей, Дмитрий, Иван, Иван, Иван].
Однако вместо этого массива требуется вывести для каждого из родителей только одно имя - то, которое встречается чаще или, если число повторений одинаково, случайное первое.
Т.к. для каждого parent может быть разное количество строк child не нашёл способа решить данную проблему в рамках запроса. Помогите, пожалуйста, если кто сталкивался с чем то подобным.
Ответы (1 шт):
Можно воспользоваться 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