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

更乾淨直觀。 –