作为测试我创建了这个架构:
CREATE TABLE simple_table (client_id int4, order_id int4);
INSERT INTO simple_table (client_id, order_id)
VALUES
(1,2),(1,3),(1,4),(1,6),(1,8),(1,12),(1,16),(1,18),(1,25),(1,32),(1,33),(1,37),(1,43),
(1,56),(1,57),(1,66),(2,2),(2,3),(2,5),(2,7),(2,9),(2,12),(2,17),(2,19),(2,22),(2,30),
(2,33),(2,38),(2,44),(2,56),(2,58),(2,66)
;
然后使用array_agg:
SELECT client_id, array_agg(order_id) FROM simple_table GROUP BY client_id;
为客户端1和客户端2创建数组:
| CLIENT_ID | ARRAY_AGG |
----------------------------------------------------------
| 1 | 2,3,4,6,8,12,16,18,25,32,33,37,43,56,57,66 |
| 2 | 2,3,5,7,9,12,17,19,22,30,33,38,44,56,58,66 |
现在我想比较2行并识别相似的值。从Postgresql文档中尝试&& overlap (have elements in common) ARRAY[1,4,3] && ARRAY[2,1]
但我遇到了问题。
也许我在看这个错误。任何帮助或指导将不胜感激!
答案 0 :(得分:2)
&&
运算符是一个谓词,它产生true
或false
结果,而不是值列表。
如果您要查找order_id
和client_id=1
同意的client_id=2
列表,则查询将为:
select order_id from simple_table where client_id in (1,2)
group by order_id having count(*)=2;
如果您认为这些数组是集合(没有重复项且值的位置无关紧要),这相当于两个数组的交集,除了您根本不需要使用数组,简单的标准SQL是够好了。
答案 1 :(得分:0)
在这里查看“array_intersect”函数: Array Intersect
要查看两个数组不共有的元素:
create or replace function arrxor(anyarray,anyarray) returns anyarray as $$
select ARRAY(
(
select r.elements
from (
(select 1,unnest($1))
union all
(select 2,unnest($2))
) as r (arr, elements)
group by 1
having min(arr) = max(arr)
)
)
$$ language sql strict immutable;