pgsql-general
❮
LISTAGG à la Oracle in PostgreSQL
- Jump to comment-1Pierre Forstmann<pierre.forstmann@gmail.com>Mar 9, 2026, 8:21 PM UTCHello,
I can write a LISTAGG aggregate for:
create table emp(deptno numeric, ename text);
I would like to know if is possible to create an aggregate LISTAGG that would work like in Oracle:SELECT deptno, LISTAGG(ename, ','::text ORDER BY ename) AS employees FROM emp GROUP BY deptno ORDER BY deptno;
I failed and IA also failed. Claude says:SELECT deptno, listagg(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees FROM emp GROUP BY deptno ORDER BY deptno;
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 ?- Jump to comment-1Paul A Jungwirth<pj@illuminatedcomputing.com>Mar 9, 2026, 10:05 PM UTCOn Mon, Mar 9, 2026 at 1:21 PM Pierre Forstmann
<pierre.forstmann@gmail.com> wrote:
I don't think you need a custom aggregate here. In Postgres you can say:
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;
select deptno,
--string_agg(ename, ',' ORDER BY ename) AS employees FROM emp GROUP BY deptno ORDER BY deptno;
Paul ~{:-)
pj@illuminatedcomputing.com- Jump to comment-1Pierre Forstmann<pierre.forstmann@gmail.com>Mar 10, 2026, 6:53 PM UTCI agree but I just would like to know if there is way to be compatible with Oracle syntax using aggregate features in PostgreSQL
Thanks.
Le 09/03/2026 à 23:05, Paul A Jungwirth a écrit :On Mon, Mar 9, 2026 at 1:21 PM Pierre Forstmann
<pierre.forstmann@gmail.com> 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 don't think you need a custom aggregate here. In Postgres you can say:
select deptno,
string_agg(ename, ',' ORDER BY ename) AS employees
FROM emp
GROUP BY deptno
ORDER BY deptno;- Jump to comment-1Juan Rodrigo Alejandro Burgos Mella<rodrigoburgosmella@gmail.com>Mar 10, 2026, 7:57 PM UTCTo do something similar, you would have to fork the source code and
implement the declarations with the same syntax, resulting in something
like Postracle.
Atte
JRBM
El mar, 10 mar 2026 a las 13:53, Pierre Forstmann (<
pierre.forstmann@gmail.com>) escribió:I agree but I just would like to know if there is way to be compatible
with Oracle syntax using aggregate features in PostgreSQL
Thanks.
Le 09/03/2026 à 23:05, Paul A Jungwirth a écrit :On Mon, Mar 9, 2026 at 1:21 PM Pierre Forstmann
<pierre.forstmann@gmail.com> 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 don't think you need a custom aggregate here. In Postgres you can say:
select deptno,
string_agg(ename, ',' ORDER BY ename) AS employees
FROM emp
GROUP BY deptno
ORDER BY deptno;- Jump to comment-1Isaac Morland<isaac.morland@gmail.com>Mar 10, 2026, 8:15 PM UTCOn Tue, 10 Mar 2026 at 15:57, Juan Rodrigo Alejandro Burgos Mella <
rodrigoburgosmella@gmail.com> wrote:To do something similar, you would have to fork the source code and
Is this the sort of thing IvorySQL could help with?
implement the declarations with the same syntax, resulting in something
like Postracle.- Jump to comment-1pierre.forstmann@gmail.comMar 11, 2026, 3:53 PM UTCActually I'm trying to do for IvorySQL.
On 10/03/2026 21:15, Isaac Morland <isaac.morland@gmail.com> wrote:On Tue, 10 Mar 2026 at 15:57, Juan Rodrigo Alejandro Burgos Mella > <rodrigoburgosmella@gmail.com <mailto:rodrigoburgosmella@gmail.com>> wrote:
To do something similar, you would have to fork the source code and
implement the declarations with the same syntax, resulting in
something like Postracle.Is this the sort of thing IvorySQL could help with?
- Jump to comment-1Pavel Stehule<pavel.stehule@gmail.com>Mar 10, 2026, 8:23 PM UTCHi
út 10. 3. 2026 v 20:58 odesílatel Juan Rodrigo Alejandro Burgos Mella <
rodrigoburgosmella@gmail.com> napsal:To do something similar, you would have to fork the source code and
orafce has listagg function https://github.com/orafce/orafce
implement the declarations with the same syntax, resulting in something
like Postracle.
Regards
Pavel
Atte
JRBM
El mar, 10 mar 2026 a las 13:53, Pierre Forstmann (<pierre.forstmann@gmail.com>) escribió:
I agree but I just would like to know if there is way to be compatible
with Oracle syntax using aggregate features in PostgreSQL
Thanks.
Le 09/03/2026 à 23:05, Paul A Jungwirth a écrit :On Mon, Mar 9, 2026 at 1:21 PM Pierre Forstmann
<pierre.forstmann@gmail.com> 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 don't think you need a custom aggregate here. In Postgres you can say:
select deptno,
string_agg(ename, ',' ORDER BY ename) AS employees
FROM emp
GROUP BY deptno
ORDER BY deptno;- Jump to comment-1Pavel Stehule<pavel.stehule@gmail.com>Mar 10, 2026, 9:47 PM UTCút 10. 3. 2026 v 21:23 odesílatel Pavel Stehule <pavel.stehule@gmail.com>
napsal:Hi
út 10. 3. 2026 v 20:58 odesílatel Juan Rodrigo Alejandro Burgos Mella <rodrigoburgosmella@gmail.com> napsal:
To do something similar, you would have to fork the source code and
implement the declarations with the same syntax, resulting in something
like Postracle.
but it doesn't support syntax WITHING GROUP syntax. Probably there is not a
orafce has listagg function https://github.com/orafce/orafce
possibility to implement it in extension without introducing a new kind of
aggregate functions in core, or enhancing behaviour of ordered-set kind of
aggregates.
Regards
PavelRegards
Pavel
Atte
JRBM
El mar, 10 mar 2026 a las 13:53, Pierre Forstmann (<pierre.forstmann@gmail.com>) escribió:
I agree but I just would like to know if there is way to be compatible
with Oracle syntax using aggregate features in PostgreSQL
Thanks.
Le 09/03/2026 à 23:05, Paul A Jungwirth a écrit :On Mon, Mar 9, 2026 at 1:21 PM Pierre Forstmann
<pierre.forstmann@gmail.com> 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 LISTAGGthat
would work like in Oracle:
SELECT deptno,
listagg(ename, ',') WITHIN GROUP (ORDER BY ename) ASemployees
FROM emp
GROUP BY deptno
ORDER BY deptno;I don't think you need a custom aggregate here. In Postgres you can
say:
select deptno,
string_agg(ename, ',' ORDER BY ename) AS employees
FROM emp
GROUP BY deptno
ORDER BY deptno;- Jump to comment-1pierre.forstmann@gmail.comMar 11, 2026, 3:53 PM UTCThanks.
On 10/03/2026 22:46, Pavel Stehule <pavel.stehule@gmail.com> wrote:út 10. 3. 2026 v 21:23 odesílatel Pavel Stehule <pavel.stehule@gmail.com > <mailto:pavel.stehule@gmail.com>> napsal:
Hi
út 10. 3. 2026 v 20:58 odesílatel Juan Rodrigo Alejandro BurgosMella <rodrigoburgosmella@gmail.com
<mailto:rodrigoburgosmella@gmail.com>> napsal:
To do something similar, you would have to fork the source code
and implement the declarations with the same syntax, resulting
in something like Postracle.orafce has listagg function https://github.com/orafce/orafce
https://github.com/orafce/orafce
but it doesn't support syntax WITHING GROUP syntax. Probably there is > not a possibility to implement it in extension without introducing a new > kind of aggregate functions in core, or enhancing behaviour of ordered- > set kind of aggregates.
Regards
PavelRegards
Pavel
Atte
JRBM
El mar, 10 mar 2026 a las 13:53, Pierre Forstmann
(<pierre.forstmann@gmail.com
<mailto:pierre.forstmann@gmail.com>>) escribió:
I agree but I just would like to know if there is way to be
compatible
with Oracle syntax using aggregate features in PostgreSQLThanks.
Le 09/03/2026 à 23:05, Paul A Jungwirth a écrit :
On Mon, Mar 9, 2026 at 1:21 PM Pierre Forstmann
<pierre.forstmann@gmail.com<mailto:pierre.forstmann@gmail.com>> 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 anaggregate LISTAGG that
would work like in Oracle:
SELECT deptno,
listagg(ename, ',') WITHIN GROUP (ORDER BYename) AS employees
FROM emp
GROUP BY deptno
ORDER BY deptno;I don't think you need a custom aggregate here. In
Postgres you can say:
select deptno,
string_agg(ename, ',' ORDER BY ename) AS employees
FROM emp
GROUP BY deptno
ORDER BY deptno;
- Jump to comment-1Juan Rodrigo Alejandro Burgos Mella<rodrigoburgosmella@gmail.com>Mar 10, 2026, 8:45 AM UTCPierre
The equivalent in PostgreSQL is through:
AtteSELECT deptno, STRING_AGG(ename, ',' ORDER BY ename) AS employeesFROM empGROUP BY deptnoORDER BY deptno;
JRBM
El lun, 9 mar 2026 a las 15:21, Pierre Forstmann (<
pierre.forstmann@gmail.com>) escribió: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 ? - Jump to comment-1Peter Eisentraut<peter@eisentraut.org>Mar 11, 2026, 1:56 PM UTCOn 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.
One of the reasons that PostgreSQL hasn't implemented LISTAGG is that it is a misdesign. It uses ordered-set aggregate syntax even
Do you agree ?
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.