超多sql分步骤类型题解
超多sql分步骤类型题解
--推荐簇每个userId,超过2个相似用户(score>50)购买过的item,排除掉自己购买过的item
想了想,没有套路,就是多练
# --订单表: orders ; 字段: userId , itemId , addTime
# --相似度表: similar ; 字段: userId , anotherUserId , score
# --输出格式: userId , itemList (逗号分隔)
# 比如 A与 B,C相似,推荐B,C购买过的 item ,其中去掉A购买的 item
思路 :
SELECT * FROM similar WHERE score>50
# 筛选出每个用户的相似用户的 所有 itemId
SELECT t1.userId AS userId
FROM t1 LEFT JOIN orders t2
ON t1.anotherUserId=t2.userId GROUP BY t1.userId, t2.itemId HAVING COUNT(t1.anotherUserId)>=2
# 筛选出每个用户它的相似用户的 所有 itemId 以及 本身的itemId
SELECT t3.userId AS userId,t3.itemId AS itemId,t4.itemId AS itemId_1 FROM t3 LEFT JOIN orders t4 ON t3.userId=t4.userId AND t3.itemId=t4.itemId
# 集合内列表
SELECT userId,collect_set(',',itemId) FROM t5 WHERE itemId_1 IS NULL GROUP BY userId;
Hive中collect相关的函数有collect_list和collect_set。
它们都是将分组中的某列转为一个数组返回,不同的是collect_list不去重而collect_set去重。
[collect相关的函数] (https://www.cnblogs.com/cc11001100/p/9043946.html)
谋定而后动,知止而有得