There is such a task in front of me: 
Tables and data are as follows:
create table t_lang (lang_id number , name varchar2(100)); delete t_lang; insert into t_lang (lang_id,name) values (1,'Chinese'); insert into t_lang (lang_id,name) values (2,'Spanish'); insert into t_lang (lang_id,name) values (4,'English'); insert into t_lang (lang_id,name) values (5,'Russian'); insert into t_lang (lang_id,name) values (6,'German'); insert into t_lang (lang_id,name) values (7,'French'); insert into t_lang (lang_id,name) values (8,'Italian'); insert into t_lang (lang_id,name) values (9,'Japanese'); insert into t_lang (lang_id,name) values (10,'Portuguese'); commit; create table t_person (person_id number , name varchar2(100)); delete t_person; insert into t_person (person_id,name) values (1,'Piter'); insert into t_person (person_id,name) values (2,'Anna'); insert into t_person (person_id,name) values (3,'Olga'); insert into t_person (person_id,name) values (4,'Max'); insert into t_person (person_id,name) values (5,'Ivan'); insert into t_person (person_id,name) values (6,'Sam'); insert into t_person (person_id,name) values (7,'Bill'); commit; create table t_pers_lang (person_id number , lang_id number); delete t_pers_lang; insert into t_pers_lang (person_id,lang_id) values (1,4); insert into t_pers_lang (person_id,lang_id) values (1,5); insert into t_pers_lang (person_id,lang_id) values (2,6); insert into t_pers_lang (person_id,lang_id) values (2,7); insert into t_pers_lang (person_id,lang_id) values (3,9); insert into t_pers_lang (person_id,lang_id) values (3,6); insert into t_pers_lang (person_id,lang_id) values (4,4); insert into t_pers_lang (person_id,lang_id) values (4,7); insert into t_pers_lang (person_id,lang_id) values (5,1); insert into t_pers_lang (person_id,lang_id) values (6,10); insert into t_pers_lang (person_id,lang_id) values (6,8); insert into t_pers_lang (person_id,lang_id) values (7,2); insert into t_pers_lang (person_id,lang_id) values (7,8); insert into t_pers_lang (person_id,lang_id) values (7,1); commit; Wrote a query that displays the desired result ...
select Группа, listagg(f2, ', ') within group (order by f2) Участники, listagg(f3, ', ') within group (order by f3) Языки from ( select NTILE(2) OVER (ORDER BY pl.person_id) Группа, (case when row_number() over (partition by p.person_id order by l.lang_id) = 1 then p.name end) f2, (case when row_number() over (partition by l.lang_id order by p.person_id) = 1 then l.name end) f3 from t_lang l, t_person p, t_pers_lang pl where l.lang_id=pl.lang_id and p.person_id=pl.person_id ) group by Группа; ... but there is one BUT!
In a subquery, I use NTILE (2), which simply breaks the entire data set equally, which is not correct. The problem is solved for a particular case.
If you change the input data (for example, replace the key of any participant with another), the query returns an incorrect result.
Question: how can I still divide the participants into groups, between which communication is not possible?
with) or trees (connect by). With them, the problem is solved quite easily - Viktorov