我有一个像这样的数组列的表:
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}
有可能吗?我不知道该怎么做。我不怎么开始吧!我迷路了!
答案 0 :(得分:4)
使用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 :(得分:2)
调用像unnest()
这样的集合返回函数的简洁方法是LATERAL
加入,自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 I@MSoP commented),因此它必须是count(*)
,而不是count (DISTINCT id)
。