在 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 时无法查看所有列的主要内容,如果未能解决你的问题,请参考以下文章

sql where后面不能使用别名吗

SQL 分组使用案例

SQL 分组使用案例

sql - 添加子查询时查询语法问题

在oracle中where 子句和having子句中的区别

如何通过sequelize在where语句中使用db函数