Hive双表关联条件编写求助:实现details_filter字段逻辑
解决Hive中新增details_filter字段的SQL实现
我来帮你搞定这个需求啦!根据你给出的匹配规则和期望输出,我们可以通过Hive的集合函数+条件判断来完成details_filter字段的计算,具体SQL如下:
WITH cust_det_groups AS ( SELECT Cust_dec, collect_set(Cust_det) AS det_list FROM Cust_buy_details GROUP BY Cust_dec ) SELECT c.Cust_id, c.Purchase, c.Purchase_detail, CASE WHEN c.Purchase = cd.Cust_dec AND array_contains(cd.det_list, c.Purchase_detail) THEN c.Purchase_detail ELSE NULL END AS details_filter FROM Customers c LEFT JOIN cust_det_groups cd ON c.Purchase = cd.Cust_dec;
代码逻辑说明:
- 预处理Cust_buy_details表:用CTE(公共表表达式)
cust_det_groups把每个Cust_dec对应的所有Cust_det值收集成一个数组集合det_list,这样每个购买决策(buy/no_buy)只会对应一条记录,后续关联更高效。 - 关联两张表:左连接
Customers表和预处理后的cust_det_groups表,关联条件是Customers.Purchase等于Cust_buy_details.Cust_dec。 - 条件判断生成目标字段:
- 当
Purchase和Cust_dec匹配,且Purchase_detail存在于对应Cust_dec的det_list集合中时,返回Purchase_detail; - 其他所有情况(包括
Purchase和Cust_dec不匹配,或者匹配但Purchase_detail不在集合里)都返回null,完全符合你给出的规则。
- 当
和示例结果的匹配验证:
- Cust_id=123:Purchase是
buy,对应的det_list包含Cheap,所以details_filter返回Cheap; - Cust_id=985:Purchase是
buy,但Purchase_detail是Deal of the day不在buy对应的det_list里,返回null; - Cust_id=978:Purchase是
no_buy,Purchase_detail是Interested不在no_buy对应的det_list里,返回null;
所有结果都和你期望的输出一致哦!
内容的提问来源于stack exchange,提问作者Bjay
相关产品推荐
相关产品推荐

