如何根据jsonb数据过滤查询?

时间:2017-07-17 09:31:28

标签: postgresql filter subquery jsonb

甚至不确定是否可以在postgres中进行此类查询。至少我被卡住了。 我有两个表:产品推荐列表,包含推荐给特定客户的多个产品;以及表明客户购买的产品和交易详情的交易表。

我试图通过绘制与推荐相匹配的所有交易(客户和产品)来跟踪推荐的效果。

以下是我的测试用例。 请帮助

create table if not exists productRec(  --Product Recommendation list
task_id int,
customer_id int,
detail jsonb);
truncate productRec;
insert into productRec values   (1, 2, '{"1":{"score":5, "name":"KitKat"}, 
                        "4":{"score":2, "name":"Yuppi"}
                        }'),

                    (1, 3, '{"1":{"score":3, "name":"Yuppi"}, 
                        "4":{"score":2, "name":"GoldenSnack"}
                        }'),
                    (1, 4, '{"1":{"score":3, "name":"Chickies"}, 
                        "4":{"score":2, "name":"Kitkat"}
                        }');

drop table txn;
create table if not exists txn( --Transaction table
customer_id int, 
item_id text,
txn_value numeric, 
txn_date date);
truncate txn;
insert into txn values  (1, 'Yuppi', 500, DATE '2001-01-01'), (2, 'Kitkat', 2000, DATE '2001-01-01'), 
                    (3, 'Kitkat', 2000, DATE '2001-02-01'), (4, 'Chickies', 200, DATE '2001-09-01');


--> Query must plot:
--Transaction value vs date where the item_id is inside the recommendation for that customer
--ex: (2000, 2001-01-01), (200, 2001-09-01) 

1 个答案:

答案 0 :(得分:0)

我们可以使用jsonb_each将每个推荐作为自己的行。我不知道如何处理key,所以我只需要value(仍为jsonb),然后使用name->>输出text)。

select
    customer_id,
    (jsonb_each(detail)).value->>'name' as name
from productrec

现在我们有一个推荐customer_iditem_id的列表。现在我们可以加入这个交易。

select
    txn.txn_value,
    txn.txn_date
from txn
join (
    select
        customer_id,
        (jsonb_each(detail)).value->>'name' as name
    from productrec
) p ON (
    txn.customer_id = p.customer_id AND
    lower(txn.item_id) = lower(p.name)
);

在您的示例数据中,您在客户2的推荐表中拼写了不同的Kitkat。我在连接条件中添加了小写来抵消,但它可能不是正确的解决方案。

 txn_value |  txn_date
-----------+------------
      2000 | 2001-01-01
       200 | 2001-09-01
(2 rows)