postgresql - 如何在 ARRAY_AGG() 中使用 DISTINCT ON?

标签 postgresql

我有以下查询:

SELECT array_agg(DISTINCT p.id) AS price_ids,
       array_agg(p.name)        AS price_names
FROM items 
         LEFT JOIN prices p on p.item_id = id
         LEFT JOIN third_table t3 on third_table.item_id = id
WHERE id = 1;

当我LEFT JOIN third_table 时,我所有的价格都被复制了。

我在 ARRAY_AGG() 中使用 DISTINCT 来获取没有重复的 ID,但我也想要没有重复的名称。

如果我使用 array_agg(DISTINCT p.name) AS price_names,它将根据名称而不是 ID 返回不同的值。

我想做类似于 array_agg(DISTINCT ON (p.id) p.name) AS price_names 的操作,但它是无效的。

如何在 ARRAY_AGG() 中使用 DISTINCT ON

最佳答案

先聚合,后加入:

SELECT p.price_ids,
       p.price_names,
       t3.*
FROM items
  LEFT JOIN (
     SELECT pr.item_id, 
            array_agg(pr.id)    AS price_ids,
            array_agg(pr.name)  AS price_names
     FROM prices pr
     GROUP BY pr.item_id
  ) p on p.item_id = items.id
  LEFT JOIN third_table t3 on third_table.item_id = id
WHERE items.id = 1;

如果您只选择一个项目,使用横向连接可能会更快:

SELECT p.price_ids,
       p.price_names,
       t3.*
FROM items
  LEFT JOIN LATERAL (
     SELECT array_agg(pr.id)    AS price_ids,
            array_agg(pr.name)  AS price_names
     FROM prices pr
     WHERE pr.item_id = items.id
  ) p on true
  LEFT JOIN third_table t3 on third_table.item_id = id
WHERE items.id = 1;

关于postgresql - 如何在 ARRAY_AGG() 中使用 DISTINCT ON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60312054/

相关文章:

sql - postgreSQL 查询 - 在记录的任何字段中查找 id 的存在

postgresql - postgres - 防止规则/触发器调用自己 - 无限循环

sql - 无法更新或删除表中的行 (Postgres)

ruby-on-rails - 用于测试和开发的不同数据库

postgresql - 获取受 PostgreSQL 更新影响的行数

ruby-on-rails - 错误 : Failed to build gem native extension

ruby-on-rails - Postgresql:将值更新为文本数据类型的一列时出现问题

SQL count(*) 在与 group by 一起使用时给出错误答案

sql - Postgres 生成系列

postgresql - 为什么我们需要像 RabbitMQ 这样的消息代理而不是像 PostgreSQL 这样的数据库?