2

我与一个阵列列像这样的表:查找阵列列重复值

my_table 
id array 
-- ----------- 
1 {1, 3, 4, 5} 
2 {19,2, 4, 9} 
3 {23,46, 87, 6} 
4 {199,24, 93, 6} 

,我想作为导致哪些地方是重复的值,如:

value_repeated is_repeated_on 
-------------- ----------- 
4     {1,2} 
6     {3,4} 

可能吗?我不知道该怎么做。我不怎么开始它!我迷路了!

回答

2

使用unnest到数组转换为行,然后array_agg建立从id小号

它应该是这个样子的数组:

SELECT v AS value_repeated,array_agg(id) AS is_repeated_on FROM 
(select id,unnest(array) as v from my_table) 
GROUP by v HAVING Count(Distinct id) > 1 

注意HAVING Count(Distinct id) > 1是筛选值,唐甚至不会出现一次

+1

请注意,正如目前所写,这将显示所有可能的值;只显示出现在至少两个地方的那些,你需要添加一个'HAVING'子句,例如'如果你确定同一个数字永远不会在同一个数组中出现两次,'HAVING Count(Distinct id)> 1',或者只是'HAVING Count(*)> 1'。 – IMSoP

+0

@IMSoP,我将它添加到我的答案 –

+0

非常感谢!完善! –

1

调用像unnest()这样的设置返回函数的干净方式是在LATERAL连接中,可用si NCE的Postgres 9.3:

SELECT value_repeated, array_agg(id) AS is_repeated_on 
FROM my_table 
    , unnest(array_col) value_repeated 
GROUP BY value_repeated 
HAVING count(*) > 1 
ORDER BY value_repeated; -- optional 

关于LATERAL

没有什么在你的问题,以排除快捷方式复制(同一元素超过一次在同一阵列中( like [email protected] commented),所以它必须是count(*),而不是count (DISTINCT id)

+0

更干净直观。 –