sql分组不会导致平均

uqjltbpv  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(267)

我正在尝试在sqlite上解决这个问题。
找出1980年以前上映电影的平均收视率与1980年以后上映电影的平均收视率之间的差异(一定要计算出每部电影的平均收视率,然后是1980年之前和1980年之后电影的平均收视率。不要只计算1980年前后的总体平均评级。
数据如下:
这是我目前得到的结果(第一组<1980):

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

有人能帮个忙吗?我不知道如何继续前进。

1cklez4t

1cklez4t1#

首先,不要按顺序聚合 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;
falq053o

falq053o2#

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

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 >= 1980m.year > 1980 .

lvjbypge

lvjbypge3#

我找到了解决办法:

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)))

相关问题