【问题标题】:SQL grouping does not lead to averageSQL分组不会导致平均
【发布时间】:2020-08-05 11:24:10
【问题描述】:

我正在尝试在 SQLite 上解决这个练习题。

找出已发行电影的平均评分之间的差异 1980 年之前和 1980 年之后发行的电影的平均评分。 (确保计算每部电影的平均评分,然后 1980 年之前的电影和之后的电影的平均值。 不要只计算 1980 年前后的总体平均收视率

数据是here:

这是我目前得到的(第一组

select title, avg(stars) from Movie join Rating
on Movie.mID=Rating.mID
where Year<1980
group by title

有人可以提供简单解决方案吗?我不知道如何继续。

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    首先,不要按title 聚合。区分电影的是 id,而不是标题(理论上可以重复)。

    您可以使用条件聚合:

    select m.mID, avg(case when m.year < 1980 then r.stars end) as pre_1980_avg,
           avg(case when m.year > 1980 then r.stars end) as post_1980_avg
    from Movie m join
         Rating r
         on m.mID = r.mID
    group by m.mID;
    

    【讨论】:

    • 我没有从中得到一个数字。
    • @learner 如果您需要一个值(通过整个数据数组),那么只需在输出列表中注释/删除 GROUP BY 子句和m.mID,
    • 代码不起作用。首先,我需要按名称计算所有电影的平均值,然后是 1980 年之前和之后。然后将这两个数字平均为一个数字。 – 学习者 7 分钟前删除
    • @learner 。 . .我留给你减去这两个值。您可以将title 添加到group byselect,但如果您想要每部电影 的结果,那么id 似乎是合适的粒度。
    【解决方案2】:

    首先获取每部电影的平均值,然后对结果使用条件聚合:

    select 
      avg(case when m.year < 1980 then t.stars end) -
      avg(case when m.year >= 1980 then t.stars end) dif
    from movie m
    inner join (
      select mid, avg(stars) stars
      from rating
      group by mid
    ) t on t.mid = m.mid
    

    如果要求不包括 1980 年,则将 m.year &gt;= 1980 更改为 m.year &gt; 1980

    【讨论】:

    • 我从这段代码中得到了正确的号码。是否可以仅通过子查询获得解决方案?
    • 不,您需要加入。
    • 是否可以在没有情况的情况下做到这一点?我不明白这个功能。
    • 这称为条件聚合。一个简单的avg(t.stars) 返回所有 部电影的平均值,因为计算中包含所有 t.stars。但是avg(case when m.year &lt; 1980 then t.stars end) 仅包括那些t.stars 用于
    • 这是一个强大的功能。这不一样吧? w3schools.com/sql/sql_case.asp
    【解决方案3】:

    我得到了解决方案:

    select ((select avg(test) from (Select avg(stars) as test from Rating join Movie
    on Rating.mID=Movie.mID
    group by title
    Having year<1980))-(select avg(test) from (Select avg(stars) as test from Rating join Movie
    on Rating.mID=Movie.mID
    group by title
    Having year>1980)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多