如何获取array2中array1的计数值

问题描述 投票:0回答:1

我有一张桌子:

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
sql postgresql
1个回答
0
投票

我会尽力为您解决这个问题:

  1. 要计算的数字,它需要同时出现在第一个数组 A 和第二个数组 B 中。
  2. 对于 A 或 B 中的任何整数,该特定整数的最终计数是其在 A 和 B 中计数的最小值。从角度来看:

情况 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;
© www.soinside.com 2019 - 2024. All rights reserved.