Re: LISTAGG à la Oracle in PostgreSQL
Peter Eisentraut <peter@eisentraut.org>
From: Peter Eisentraut <peter@eisentraut.org>
To: Pierre Forstmann <pierre.forstmann@gmail.com>,
"pgsql-general@lists.postgresql.org" <pgsql-general@lists.postgresql.org>
Date: 2026-03-11T13:55:53Z
Lists: pgsql-general
On 09.03.26 21:21, Pierre Forstmann wrote: > Hello, > > I can write a LISTAGG aggregate for: > > create table emp(deptno numeric, ename text); > > SELECT deptno, LISTAGG(ename, ','::text ORDER BY ename) AS employees > FROM emp GROUP BY deptno ORDER BY deptno; > > I would like to know if is possible to create an aggregate LISTAGG that > would work like in Oracle: > > SELECT deptno, > listagg(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees > FROM emp > GROUP BY deptno > ORDER BY deptno; > > I failed and IA also failed. Claude says: > > It is not possible to exactly replicate listagg(ename, ',') WITHIN GROUP > (ORDER BY ename) as a custom PostgreSQL aggregate > because PostgreSQL strictly forbids ungrouped columns as direct > arguments to ordered-set aggregates. > > Do you agree ? One of the reasons that PostgreSQL hasn't implemented LISTAGG is that it is a misdesign. It uses ordered-set aggregate syntax even though it is not very similar to the other ordered-set aggregates. Its syntax should be more similar to ARRAY_AGG or JSON_ARRAYAGG, for example. But it's too late to fix the standard on this.