![](/img/trans.png)
[英]PostgreSQL: Getting STRING_AGG to respect the ordering from a CTE
[英]Ordering DISTINCT with string_agg using another column on PostgreSQL 13?
我有一个emails
表:
CREATE TABLE public.emails (
id bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
(MAXVALUE 9223372036854775807),
name text not null
);
我有一个contacts
表:
CREATE TABLE public.contacts (
id bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
(MAXVALUE 9223372036854775807),
email_id bigint NOT NULL,
full_name text NOT NULL,
ordering int not null
);
并记录如下:
insert into emails (name) VALUES ('dennis1');
insert into emails (name) VALUES ('dennis2');
insert into contacts (id, email_id, full_name, ordering) VALUES (5, 1, 'dennis1', 9);
insert into contacts (id, email_id, full_name, ordering) VALUES (6, 2, 'dennis1', 5);
insert into contacts (id, email_id, full_name, ordering) VALUES (7, 2, 'dennis5', 1);
insert into contacts (id, email_id, full_name, ordering) VALUES (8, 1, 'john', 2);
我的查询获取数据如下:
SELECT
"emails"."name",
STRING_AGG(DISTINCT CAST("contacts"."id" AS TEXT), ','
ORDER BY CAST("contacts"."id" AS TEXT)) AS "contact_ids"
FROM "emails"
INNER JOIN "contacts"
ON ("contacts"."email_id" = "emails"."id")
WHERE "emails"."id" > 0
GROUP BY "emails"."name"
ORDER BY "emails"."name" DESC LIMIT 50
name contact_ids
dennis2 6,7
dennis1 5,8
name contact_ids
dennis2 7,6
dennis1 8,5
我想根据ordering
列作为DESC
订购contact_ids
,但我不想获取ordering
列。 只需使用它来订购联系人的 ID。
如何根据ordering
列对contact_ids
的每个id
进行排序?
演示: https://dbfiddle.uk/?rdbms=postgres_12&fiddle=4d6851ec67b579608427bb399eae5891
如果您在加入之前聚合,则不需要 DISTINCT,您可以随意订购任何您想要的东西:
select em.name,
c.contact_ids
from emails em
join (
select email_id, string_agg(id::text, ',' order by ordering desc) as contact_ids
from contacts
group by email_id
) c on c.email_id = em.id
order by em.name desc
limit 50;
我想,省略排序列是因为问题,你不能在聚合中使用它DISTINCT
。
因此,您可能可以在聚合之前执行DISTINCT
:
SELECT
"name",
STRING_AGG(CAST("id" AS TEXT), ','
ORDER BY "ordering") AS "contact_ids"
FROM (
SELECT DISTINCT ON ("contacts"."id")
"emails"."name",
"contacts"."id",
"contacts"."ordering"
FROM "emails"
INNER JOIN "contacts"
ON ("contacts"."email_id" = "emails"."id")
WHERE "emails"."id" > 0
ORDER BY "contacts"."id"
) s
GROUP BY "name"
ORDER BY "name" DESC LIMIT 50
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.