检索最早日期的平均值

时间:2020-11-06 15:38:26

标签: mysql sql

我正在练习MySQL,并且正在尝试解决练习。我的数据包含某家酒店的评论。数据包含不同用户的评论:如果一个用户访问了不止一次,则可以有很多评论。每个评论都有自己的id,然后评论值从1到5。

评论也有日期,现在,我想计算第一次访问的平均评论(最早的日期)。我的问题是,我尝试检索最早日期的方法实际上不起作用。我的意思是,无论是否使用HAVINGWHERE方法,我都会得到相同的结果。有没有人可以帮助我呢?谢谢!

这是我的查询(我尝试使用HAVINGWHERE方法)

SELECT AVG(overall_rating), AVG(rooms_rating), AVG(service_rating), AVG(location_rating), AVG(value_rating)
FROM reviews
HAVING MIN(review_date)
#WHERE review_date IN (SELECT MIN(review_date) FROM repatrons_reviews GROUP BY id)

以下是数据示例

  user_id  | id  |  rooms_rating  | service_rating  |  location_rating  | value_rating |    date  
---------------------------------------------------------------------------------------
 matt21   |  123  |       4        |        5        |         2         |      4       |  2007-08-20

2 个答案:

答案 0 :(得分:1)

您可以使用“不存在”来做到这一点:

SELECT AVG(r.overall_rating), AVG(r.rooms_rating), AVG(r.service_rating), AVG(r.location_rating), AVG(r.value_rating)
FROM reviews r
WHERE NOT EXISTS (SELECT 1 FROM reviews WHERE user_id = r.user_id AND date < r.date)

答案 1 :(得分:1)

SELECT ...
FROM reviews
HAVING MIN(review_date)

无法工作。假设表格中的最小日期为DATE '2020-01-01',那么HAVING DATE '2020-01-01'应该是什么意思?

SELECT ...
FROM reviews
WHERE review_date IN (SELECT MIN(review_date) FROM reviews GROUP BY id);

已经结束,但这不是每个ID的最小日期,而是您想要的每个用户ID的最小日期。而且,如果将id替换为user_id,那么仍然存在问题,因为一个用户的第一个日期是另一个用户的第三个日期。

此查询已更正:

SELECT
  AVG(overall_rating), AVG(rooms_rating),
  AVG(service_rating), AVG(location_rating), AVG(value_rating)
FROM reviews
WHERE (user_id, review_date) IN 
         (SELECT user_id, MIN(review_date) FROM reviews GROUP BY user_id);