如何在SQL查询中计算列平均值并查询产品名称、平均星级与最新评价日期
产品评分查询修正方案
现有SQL的问题
INNER JOIN未指定关联条件,会触发两张表的全量笛卡尔积匹配,结果完全不符合预期- 缺失需求要求的「最新评价日期」统计逻辑
- 未对产品维度做分组,聚合函数
AVG(rating_stars)会将所有产品的评分合并计算,无法得到单个产品的平均星级 - 表结构定义中存在小问题:rating表的外键引用的是
Products表,但实际创建的产品表名为product,如果你的数据库对表名大小写敏感,需要先修正此处的拼写不一致问题,否则关联会报错。
符合需求的查询语句
SELECT p.product_name, AVG(r.rating_stars) AS average_rating, MAX(r.rating_date) AS latest_rating_date FROM rating r INNER JOIN product p ON r.prod_id = p.prod_id -- 如果需要展示从未收到过评价的产品,把上面的INNER JOIN改成LEFT JOIN即可 GROUP BY p.prod_id, p.product_name ORDER BY average_rating DESC;
逻辑说明
- 用
ON r.prod_id = p.prod_id指定两张表的关联关系,保证产品和对应评价正确匹配 - 用
MAX(r.rating_date)统计每个产品的最新评价日期 - 按产品主键
prod_id和产品名称分组,保证聚合计算的是单产品的维度数据,也符合大多数SQL模式的分组规范 - 按照计算出来的平均星级别名
average_rating做降序排序,符合要求。
内容的提问来源于stack exchange,提问作者YAYAFAILINGUNI
相关产品推荐
相关产品推荐

