如何删除使用array_agg postgres函数生​​成的重复项

Pet*_*vic 38 sql postgresql select array-agg

有没有人知道如何重写以下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
Run Code Online (Sandbox Code Playgroud)

可执行查询可在sqlfiddle.com获得.单击Run SQL按钮,结果将包含两次Frantisek Smith

Mur*_*nik 64

您可以在distinct里面使用关键字array_agg:

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
Run Code Online (Sandbox Code Playgroud)

SQLFiddle有这个例子

  • 错误:没有为窗口函数实现DISTINCT SQL状态:0A000(PostgreSQL 9.5.5) (4认同)
  • 有什么方法可以使用distinct来保存订单? (3认同)
  • 让我不必编写自己的聚合函数! (2认同)

Vér*_*ace 5

ARRAY_TO_STRING(ARRAY_AGG(当一个简单的STRING_AGG操作如下时,无需在房子周围走来走去(代码可在此处的小提琴上找到):

--
-- 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;
Run Code Online (Sandbox Code Playgroud)

结果:

                The workers
Frantisek Smith, Peter Duff
Run Code Online (Sandbox Code Playgroud)