甚至不确定是否可以在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)
答案 0 :(得分:0)
我们可以使用jsonb_each
将每个推荐作为自己的行。我不知道如何处理key
,所以我只需要value
(仍为jsonb
),然后使用name
(->>
输出text
)。
select
customer_id,
(jsonb_each(detail)).value->>'name' as name
from productrec
现在我们有一个推荐customer_id
和item_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)