开发者社区> 问答> 正文

如何在SQL中获得至少X评论的所有产品?

我想找到所有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

'''

展开
收起
社区小助手 2018-12-21 13:39:17 1885 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    将所有热门评论的项目作为单独的查询查找,然后将其加入以获取其余数据

    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一起与之相关)

    2019-07-17 23:23:23
    赞同 展开评论 打赏
问答分类:
SQL
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载
AnalyticDB基础版:云原生My SQL 敏捷数仓 立即下载