在 Postgres 数组中查找重复项,并另存为不同的字段

K. *_*esi 0 postgresql

我的 Postgres 表架构有两个字段:

items,其中包含(整数)项 ID 的数组。如果相同的 ID 在数组中出现两次,则将其视为主要项。

primary_items,我刚刚添加到架构中的另一个(整数)项目 ID 数组,因此它目前在所有行中都是空的。

我需要做的是:对于每一行,检查 中是否有重复的 ID items,如果有,将每个重复 ID 中的一个放入该primary_items字段。

知道如何通过查询来解决这个问题吗?理想情况下,我不必编写帮助程序 (Nodejs) 来执行此操作,但如果需要,我可以。

例子:

当前:

documents_table
items          primary_items
------------   -----------
{1, 2, 2, 4}    {}
{1, 2, 3}       {}
{3, 3}          {}
{5, 4, 5, 4}    {}
Run Code Online (Sandbox Code Playgroud)

期望:

documents_table
items          primary_items
------------   -----------
{1, 2, 2, 4}    {2}
{1, 2, 3}       {}
{3, 3}          {3}
{5, 4, 5, 4}    {5,4}
Run Code Online (Sandbox Code Playgroud)

kli*_*lin 5

你可以用这个简单的查询找到重复的元素:

select array_agg(item)
from (
    select item
    from unnest('{5, 4, 5, 4}'::int[]) as item
    group by item
    having count(*) > 1
) s

 array_agg 
-----------
 {4,5}
(1 row) 
Run Code Online (Sandbox Code Playgroud)

在函数中使用查询:

create or replace function find_primary_items(arr anyarray)
returns anyarray language sql immutable
as $$
    select array_agg(item)
    from (
        select item
        from unnest(arr) as item
        group by item
        having count(*) > 1
    ) s
$$;
Run Code Online (Sandbox Code Playgroud)

现在更新非常简单:

update documents_table
set primary_items = coalesce(find_primary_items(items), '{}')
returning *;

   items   | primary_items 
-----------+---------------
 {1,2,2,4} | {2}
 {1,2,3}   | {}
 {3,3}     | {3}
 {5,4,5,4} | {4,5}
(4 rows)
Run Code Online (Sandbox Code Playgroud)