hive 如何在sql中选择至少有3个产品评分至少为4/5的已评审产品ID的用户ID对

qv7cva1a  于 2022-11-05  发布在  Hive
关注(0)|答案(2)|浏览(180)

我有这样一个数据集:
| 用户标识|产物|刻痕|
| - -|- -|- -|
| A级|一个|四个|
| A级|2个|四个|
| A级|三个|五个|
| B|一个|四个|
| B| 2个|四个|
| B|三个|五个|
我希望有这样的输出:
| 用户标识1|用户标识2|匹配产品|
| - -|- -|- -|
| A级|B| 1 2 3|
但我只能通过以下查询获得前两列:

CREATE TABLE score_greater_than_3 AS
SELECT userid, productid, score
FROM reviews
WHERE score >= 4;

SELECT s1.userid as userid1, s2.userid as userid2
FROM score_greater_than_3 s1 
INNER JOIN score_greater_than_3 s2 ON s1.productid=s2.productid AND s1.userid<s2.userid
GROUP BY s1.userid, s2.userid
HAVING count(*)>=3;

我如何才能得到匹配的产品?我可以与这样的输出,如果它更容易
| 使用者1|用户2|配套产品|
| - -|- -|- -|
| 一种|B|一个|
| 一种|B| 2个|
| 一种|B|三个|

xcitsw88

xcitsw881#

请尝试以下操作:

select s1.userid as userid1, s2.userid as userid2, 
GROUP_CONCAT(s1.productid) 
from score_greater_than_3 s1 inner join score_greater_than_3 s2 on s1.productid=s2.productid and s1.userid<s2.userid
group by s1.userid, s2.userid;

整个脚本请看:DB Fiddle

lhcgjxsq

lhcgjxsq2#

您可以尝试使用下列查询:

WITH cte AS (
    SELECT r.userid,
           r.productid
    FROM reviews r
    WHERE r.score > 3
)
SELECT r1.userid,
       r2.userid,
       GROUP_CONCAT(r1.productid SEPARATOR ' ')       
FROM       cte r1
INNER JOIN cte r2
        ON r1.productid = r2.productid
       AND r1.userid < r2.userid
GROUP BY r1.userid,
         r2.userid
HAVING COUNT(*) >= 3

它使用一个Common Table Expression,允许您在一个临时空间中分配表,该临时空间将持续到查询结束。您的下一步使用自连接是正确的,尽管它缺少GROUP_CONCAT聚合函数,该函数允许您在一个类似字符串的字段上进行聚合。您可以设置“separator”参数来决定要使用哪个字符串来连接值。
尝试完整查询here

相关问题