在 SQL 中使用 AVG 和 WHERE 时无法查看所有列
Posted
技术标签:
【中文标题】在 SQL 中使用 AVG 和 WHERE 时无法查看所有列【英文标题】:Unable to view all column when using AVG and WHERE in SQL 【发布时间】:2020-07-30 20:28:42 【问题描述】:book_isbn user_iduser 评分评论日期
1443434973, 2, 2,"Big Brother said this book was a four out of 5.", 2008-06-09
1501142976, 1, 3,"The book was scary, too scary.", 2006-05-04
1594130000, 3, 4,"The moview was better.", 2008-06-10
1501142976, 4, 5,"I have been inspired to pursue a career as a clown",2019-03-04
当我查询时
SELECT * ,AVG(rating)
FROM geektextdb.rating
WHERE book_isbn = '1501142976';`
我只得到表中的第二行,但我试图得到第二和第四行。
附:我不确定这篇文章的格式是否正确我经常使用这个网站,但任何有关格式的提示都会有所帮助
【问题讨论】:
根据您的查询,您将获得 1 行是正确的。 查询实际上不应该运行。这根本没有意义。 【参考方案1】:我认为你想要一个窗口函数,而不是聚合:
SELECT r.*, AVG(rating) OVER (PARTITION BY book_isbn)
FROM geektextdb.rating r
WHERE book_isbn = '1501142976';
【讨论】:
如果你想查看所有记录,那本书的平均值是每行重复的,这是正确的答案【参考方案2】:这不是一个有效的聚合查询。如果您想要特定 book_isbn
的总体平均值,那么:
select avg(rating) avg_rating
from geektextdb.rating
where book_isbn = '1501142976'
这会为您提供一个标量结果集(一行一列),其中包含该书的平均评分。
另一方面,如果您想要所有行以及每行重复的平均评分,那么您可以使用窗口函数(仅在 mysql 8.0 中可用):
select r.*, avg(rating) over() avg_rating
from geektextdb.rating r
where book_isbn = '1501142976'
如果您想一次对所有书籍获得相同的结果,以及每本书的平均评分,这里是等效的查询。
聚合(每本书一行):
select book_isbn, avg(rating) avg_rating
from geektextdb.rating
group by book_isbn
窗口化:
select r.*, avg(rating) over(partition by book_isbn) avg_rating
from geektextdb.rating r
【讨论】:
以上是关于在 SQL 中使用 AVG 和 WHERE 时无法查看所有列的主要内容,如果未能解决你的问题,请参考以下文章