我想找到所有product_id至少有3条评论的行(review_id)。
因此对于以下示例:
product_id, review_id
1, 1
1, 2
1, 3
2, 4
3, 5
4, 6
4, 7
4, 8
它应该返回:
product_id, review_id
1, 1
1, 2
1, 3
4, 6
4, 7
4, 8
这些是我试过的查询:
query1 = '''
SELECT first_value(customer_id), first_value(review_id), first_value(product_id)
FROM df
WHERE product_category='Toys' OR product_category='Beauty'
GROUP BY product_id
HAVING COUNT(*) >= 5
'''
以上只返回第一个结果,但是当我不使用该first_value函数时,我收到一个错误"expression 'df.review_id' is neither present in the group by, nor is it an aggregate function.
query1 = '''
SELECT customer_id, review_id, product_id
FROM df
WHERE product_category='Toys' OR product_category='Beauty'
GROUP BY product_id
HAVING COUNT(*) >= 5
'''
将所有热门评论的项目作为单独的查询查找,然后将其加入以获取其余数据
SELECT df.* FROM
df
INNER JOIN
(
SELECT product_id
FROM df
WHERE product_category='Toys' OR product_category='Beauty'
GROUP BY product_id
HAVING COUNT(*) >= 5
) interesting
on df.product_id = interesting.product_id
这是您需要采用的一般模式,用于分组/计数,然后获取有关该组中产品的更多数据。您无法向执行分组的查询添加更多列,因为这会将组拆分为较小的计数,从而降低到阈值以下。您只需计算ID的出现次数,将其限制为只有那些具有超过某个值的那些ID,然后使用该有趣ID列表来检索这些ID的其余信息,方法是将其连接回具有该值的表。所有数据
支持分析查询的数据库可以一次性完成,但上面的查询模式适用于不支持分析的数据库,因此我倾向于使用它。
可以查询支持分析的数据库:
SELECT * FROM
(
SELECT *, COUNT(*) OVER(partition by product_id) numrev
FROM df
WHERE product_category='Toys' OR product_category='Beauty'
) interesting
WHERE numrev >= 5
COUNT(*)OVER()基本上做同样的事情; 数据库将计算每个产品的出现次数并在每行上显示产品的计数,然后where子句仅限制超过4个计数的行。假设第一个示例中的子查询组隐藏在此示例的后台(分区是分组操作)中,并暗示加入(因为计算的产品ID放在每一行,并且与实际产品ID一起与之相关)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。