gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:33:14 26 4
gpt4 key购买 nike

我有以下查询:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com