PostgreSQL:获取 array1 值在 array2 中出现的次数

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

我有一张桌子:

client_id 订单_id items_current_order items_next_order
905562 4254677 {1,2,4} {1}
905562 4254645 {1,2,5,6} {1, 6}

我需要计算 items_current_order 中包含的 items_next_order 中的商品比例。

例如,对于 order_id = 4254645,份额应为 50%(或 0.5),因为 4 个 items_next_order 商品中只有 2 个包含在 items_current_order 中。

我尝试像这样计算金额(而不是份额)::

SELECT
    client_id ,
    COUNT(1) AS count_values
FROM
    (SELECT
         client_id ,
         unnest(items_next_order) AS value
     FROM
         orders
     GROUP BY
         1, 2) AS a
WHERE
    value = ANY (SELECT unnest(items_current_order) FROM orders as rj WHERE rj.client_id = a.client_id )
GROUP BY
    client_id 

但是我需要按 client_id , order_id 进行分组

我期望的结果:

client_id 订单_id items_current_order items_next_order 分享
905562 4254677 {1,2,4} {1} 0.33
905562 4254645 {1,2,5,6} {1, 6} 0.5
postgresql postgresql-9.5
1个回答
0
投票

这是一个有效的查询,可以完成您想要做的事情:

SELECT 
 order_id, 
 items_current_order,
 items_next_order,
 (
    SELECT COUNT(*) FROM unnest(items_current_order) AS i
   WHERE i = ANY(items_next_order)
 )::FLOAT / array_length(items_current_order,1)::FLOAT AS share
 FROM T

说明:

  • 我们使用子查询与
    unnest
    相结合来迭代
    items_current_order
    的项目并计算
    items_next_order
    中包含多少个项目。
  • 然后将其除以
    items_current_order
    数组的长度即可得到比率
  • 在这两种情况下,我们都将整数值转换为浮点值以获得浮点响应。
© www.soinside.com 2019 - 2024. All rights reserved.