我有一张桌子:
CREATE TABLE T (
order_id Integer PRIMARY KEY,
items_current_order Integer[],
items_next_order Integer[]
);
INSERT INTO T(order_id, items_current_order, items_next_order) VALUES (4254677, '{1, 1, 1}', '{1, 1}');
INSERT INTO T(order_id, items_current_order, items_next_order) VALUES (4254645, '{1,2,5,6}', '{1,1,6}');
我需要计算 items_current_order 中包含的 items_next_order 的元素数量。
我期望的结果:
client_id | 订单_id | items_current_order | items_next_order | 数 |
---|---|---|---|---|
905562 | 4254677 | {1, 1, 1} | {1, 1} | 2 |
905562 | 4254645 | {1,2,5,6} | {1, 1, 6} | 2 |
例如,对于 order_id = 4254645,结果(计数)应为 2,因为 items_current_order 中仅包含值 items_next_order (1, 6) 中的 2 个。
items_next_order 中的第二个 {1} 不包括在内,因为 items_current_order 中只有一个。
我正在尝试类似的事情:
select
order_id
, items_current_order
, items_next_order
, (SELECT
COUNT(case when arr=matches then matches end)
FROM unnest(items_current_order) arr cross join unnest(items_next_order) matches
where arr is not null and matches is not null )
from T
我会尽力为您解决这个问题:
情况 1 - A = {1, 1}; B = {1,},计数将为 1。
情况 2 - A = {1,}; B = {1,},计数将为 1。
情况 3 - A = {1,}; B = {1,1},计数将为 1。
从案例1和案例2可以看出,其中一个阵列成为“限制试剂”。
因此,我提出了一个解决方案,获取 A 和 B 中每个整数的计数最小值并将其相加。
SQL 代码可能如下所示:
select order_id, items_current_order, items_next_order, (
with a as (
select a, count(*) as ac from unnest(items_current_order) a group by a
), b as (
select b, count(*) as bc from unnest(items_next_order) b group by b
) select sum(least(ac, bc))
from b
inner join a on a.a = b.b
) from t;