如何删除使用 array_agg postgres 函数生成的重复项
Posted
技术标签:
【中文标题】如何删除使用 array_agg postgres 函数生成的重复项【英文标题】:How to remove duplicates, which are generated with array_agg postgres function 【发布时间】:2014-12-09 10:04:52 【问题描述】:有没有人知道如何重写以下 SQL 查询以生成只包含一次出现的名称的结果? (按用户分组的结果)。
查询
SELECT array_to_string(array_agg(CONCAT(u.firstname, ' ', u.lastname)), ', ')
FROM log_has_item logitem
INNER JOIN log log ON log.id = logitem.log_id
INNER JOIN worker u ON log.worker_id = u.id
WHERE logitem.company_id = 1
sqlfiddle.com 上提供可执行查询。 单击运行 SQL 按钮,您将得到结果,其中包含 Frantisek Smith 两次
【问题讨论】:
array_agg(distinct concat(...)))
在 postgre 9.0+ 中有 string_agg(text,text)
函数。写string_agg(CONCAT(...),', ')
可能更容易
@a_horse_with_no_name distinct 工作正常,但会打乱顺序。有什么办法保存吗?
@Rodrigo:在string_agg()
内使用order by
@a_horse_with_no_name 我尝试了 string_agg(distinct nome order by l.id,', ') 和 string_agg(distinct nome order by nome,', '),但两者都给出“函数 string_agg(字符变化)不存在”。我会用完整的sql问一个问题给你看。
【参考方案1】:
您可以在array_agg
中使用distinct
关键字:
SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT CONCAT(u.firstname, ' ', u.lastname)), ', ')
FROM log_has_item logitem
INNER JOIN log log ON log.id = logitem.log_id
INNER JOIN worker u ON log.worker_id = u.id
WHERE logitem.company_id = 1
SQLFiddle with this example
【讨论】:
有什么方法可以使用 distinct 来保存订单? 错误:没有为窗口函数实现 DISTINCT SQL 状态:0A000 (PostgreSQL 9.5.5) 让我不必编写自己的聚合函数!STRING_AGG
会不会更好?看我的回答。【参考方案2】:
当一个简单的STRING_AGG
将执行以下操作时,无需使用ARRAY_TO_STRING(ARRAY_AGG(
到处走动(代码在小提琴here 上可用):
--
-- Simplified
--
SELECT
DISTINCT
STRING_AGG
(
DISTINCT CONCAT(w.firstname, ' ', w.lastname), ', '
) AS "The workers"
FROM log_item li
INNER JOIN log l ON li.log_id = l.id
INNER JOIN worker w ON l.worker_id = w.id
WHERE li.company_id = 1;
结果:
The workers
Frantisek Smith, Peter Duff
【讨论】:
以上是关于如何删除使用 array_agg postgres 函数生成的重复项的主要内容,如果未能解决你的问题,请参考以下文章
Postgres 未在 array_agg 查询中返回数据,如下所示
postgres array_agg 错误:无法累积不同维度的数组