如何删除使用 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 错误:无法累积不同维度的数组

使用postgres json当键为空时删除行

我如何联接两个以上的postgres表,并在postgres中将其作为nestedjson获得结果

如何在 bigquery 中删除 array_agg

单个查询中的多个 array_agg() 调用