SQLite Exists关键字:如何查询最高平均值?

时间:2012-04-15 10:18:42

标签: sql sqlite average exists highest

在一个包含两列'mID'和'stars'的SQLite数据库表中,我必须返回'mID',其中'stars'的平均值最高。

拥有以下数据:

  Rating
mID  stars
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  avg(stars)
101     3.0
103     2.5
104     2.5
106     4.5
107     4.0
108     3.33333333333

如果我只是返回“星星”的最高平均值,则 然后我就可以选择像max max(theAvg)这样的东西,然后是我刚才计算的东西 但是,为了获得与其“mID”相关的最高平均“明星”,我还需要其他东西。

所以我使用'not exists'关键字后跟一个子查询,该子查询生成另一个'mID'和'stars'表。 该子查询与原始表进行比较,以验证对于原始表R1中的某些平均“星号”值,没有新表R2的平均“星号”值大于R1的平均“星号”值

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)时,因为我们正在寻找所有“星星”平均值的最高平均值。

The result of my query(Wrong):
mID  theAvg
106    4.5
107    4.0

The desired Result:
mID  theAvg
106    4.5

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

2 个答案:

答案 0 :(得分:1)

对不起,我对SQL和SO有点新鲜,但我找到了一个解决方案,当有最高平均值(明星)(或者更特别是未知数量的关系,并且在这种情况下你可以&# 39;轻松设置有序输出的限制)。就像我说的那样,我有点不高兴所以它有点凌乱:

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。逻辑与你原来的非常相似。

关于两个元组的问题:我不太明白你哪里出错了,但如果我弄明白的话,我会告诉你。

答案 1 :(得分:0)

您平均可以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