4

在具有“mID”和“stars”两列的 SQLite 数据库表中,我必须返回“mID”的平均值最高的“stars”。

拥有以下数据:

  评级
mID  
101 2
101 4
106 4
103 2
108 4
108 2
101 3
103 3
104 2
108 4
107 3
106 5
107 5
104 3

我会首先通过按“mID”对每个“mID”进行分组来平均“星”,例如

select mID, avg(stars) theAvg
from Rating
group by mID;

结果,我会得到每个“mID”的平均“星”值表。

mID  平均(星)
101 3.0
103 2.5
104 2.5
106 4.5
107 4.0
108 3.33333333333

如果我只返回'stars'的最高平均值,
那么我可以只取select max(theAvg)之类的东西,然后是我刚刚计算的东西。
但是,为了获得与其“mID”相关的最高平均“星星”,我需要其他东西。

因此,我使用了“不存在”关键字,后跟一个子查询,该子查询生成另一个“mID”和“stars”表。此子查询与原始表进行比较,以验证对于原始表 R1 中的某些平均“星”值,不存在大于 R1 的平均“星”值的新表 R2 的平均“星”值

select mID, theAvg
from (select mID, avg(stars) theAvg
from Rating
group by mID) as R1
where not exists(select * from 
(select mID, avg(stars) theAvg
from Rating
group by mID) as R2
where R2.theAvg > R1.theAvg);

我认为作为这个查询的结果,我会得到最高的平均星数,它是 mID,但我得到的是两个元组 ('mID':106, 'theAvg':4.5) 和 ('mID':107, ' theAvg':4.0),当期望的答案只有一个元组 ('mID':106, 'theAvg':4.5),因为我们正在寻找所有“stars”平均值的最高平均值。

我的查询结果(错误):
mID   theAvg
106 4.5
107 4.0

期望的结果:
mID   theAvg
106 4.5

你认为我做错了什么步骤?有什么建议你会怎么做吗?

4

2 回答 2

1

抱歉,我对 SQL 和 SO 有点陌生,但我找到了一个解决方案,该解决方案适用于最高 avg(stars) 的平局(或者更具体地说是未知数量的平局,在这种情况下你不能轻易设置有序输出的限制)。就像我说的,我有点笨,所以有点乱:

select title, avg(stars)
from movie join rating using(mID)
where mID not in (select R1.mID  
from (select avg(stars) theAvg, mID, ratingDate from Rating group by mID) 
as R1
join (select avg(stars) theAvg, mID, ratingDate from Rating group by mID)
as R2 
where R1.theAvg < R2.theAvg)
group by mID;

子查询返回平均星级低于任何其他电影的平均星级的任何电影的 mID,主查询的 where 语句采用子查询未返回的任何 mID。逻辑与您最初的逻辑非常相似。

至于二元组问题:我真的不明白你哪里出错了,但如果我弄明白了我会告诉你的。

于 2014-08-21T00:38:26.277 回答
1

order by desc平均而言,您可以添加一个limit子句,如下所示:

select mID, avg(stars) theAvg
from Rating
group by mID
order by theAvg desc limit 1;

应该给你这个:

sqlite> create table Rating (mID INT, stars INT);
sqlite> 
sqlite> insert into Rating values (101, 2);
sqlite> insert into Rating values (101, 4);
sqlite> insert into Rating values (106, 4);
sqlite> insert into Rating values (103, 2);
sqlite> insert into Rating values (108, 4);
sqlite> insert into Rating values (108, 2);
sqlite> insert into Rating values (101, 3);
sqlite> insert into Rating values (103, 3);
sqlite> insert into Rating values (104, 2);
sqlite> insert into Rating values (108, 4);
sqlite> insert into Rating values (107, 3);
sqlite> insert into Rating values (106, 5);
sqlite> insert into Rating values (107, 5);
sqlite> insert into Rating values (104, 3);
sqlite> 
sqlite> select mID, avg(stars) theAvg
   ...> from Rating
   ...> group by mID
   ...> order by theAvg DESC LIMIT 1;
106|4.5

以这种方式记录文档:http ://www.sqlite.org/lang_select.html#orderby

于 2012-04-15T14:09:28.230 回答