La versión 19c de la base de datos Oracle incluye una interesante mejora a la función
LISTAGG, largamente solicitada y esperado por los desarrolladores.
La versión 12.2 ya introdujo algunas mejoras realmente interesantes, las cuales ya compartí en este articulo
Oracle 12c R2 - LISTAGG y OVERFLOW.
Ahora es posible eliminar los valores repetidos utilizando la opción
DISTINCT. Veamos el siguiente ejemplo (tomado del blog de
Connor McDonald):
SELECT deptno,
listagg(job,',') WITHIN GROUP ( ORDER BY job) AS jobs
FROM scott.emp
GROUP BY deptno
ORDER BY 1;
DEPTNO JOBS
--------- --------------------------------------------------
10 CLERK,MANAGER,PRESIDENT
20 ANALYST,ANALYST,CLERK,CLERK,MANAGER
30 CLERK,MANAGER,SALESMAN,SALESMAN,SALESMAN,SALESMAN
Ahora es muy sencillo eliminar los valores duplicados simplemente utilizando la opción
DISTINCT:
SELECT deptno,
listagg(distinct job,',') WITHIN GROUP ( ORDER BY job) AS jobs
FROM scott.emp
GROUP BY deptno
ORDER BY 1;
DEPTNO JOBS
--------- --------------------------------------------------
10 CLERK,MANAGER,PRESIDENT
20 ANALYST,CLERK,MANAGER
30 CLERK,MANAGER,SALESMAN
Si quieren probarlo ustedes mismo, nada mejor que los ejemplos disponibles en
Oracle Live SQL (entorno de base de datos gratuito en la nube provisto por Oracle).
También es útil revisar la sintaxis completa de la función
LISTAGG en la
documentación de Oracle 19c.