WITH COMMON TABLE EXPRESSION we can do something like this-
with t (emp_name, department, rn) as ( select emp_name, department,row_number()
over (partition by department order by emp_name) as rn
from employee8),
c (emp_name, department, rn) as (select emp_name,department, rn from t where rn = 1
union all
select (c1.emp_name) ||', '|| t1.emp_name, t1.department, c1.rn+1
from t t1 , c c1
where t1.department = c1.department
and c1.rn + 1 = t1.rn
)
select emp_name, department
from c c1
where rn = (select max(rn)
from c c2
where c1.department = c2.department)
order by department;
By using dense_rank and rownumber we can do it like-
with t (emp_name, department, rn) as ( select emp_name, department,row_number()
over (partition by department order by emp_name) as rn
from employee8),
c (emp_name, department, rn) as (select emp_name,department, rn from t where rn = 1
union all
select (c1.emp_name) ||', '|| t1.emp_name, t1.department, c1.rn+1
from t t1 , c c1
where t1.department = c1.department
and c1.rn + 1 = t1.rn
)
select emp_name, department
from c c1
where rn = (select max(rn)
from c c2
where c1.department = c2.department)
order by department;