В таблице базы данных SQLite с двумя столбцами «mID» и «звездочки» я должен вернуть «mID» с наивысшими средними значениями «звездочек».
Имея следующие данные:
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
Если бы я просто вернул наивысшее среднее значение «звезд»,
тогда я мог бы просто взять что-то вроде select max (theAvg), а затем то, что я только что вычислил.
Но затем, чтобы получить наивысшее среднее значение » звёзды, связанные с его «средним», мне нужно было кое-что еще.
Поэтому я использовал ключевое слово «не существует», за которым следует подзапрос, который генерирует еще одну таблицу «mID» и «звездочки». Этот подзапрос сравнивается с исходной таблицей, чтобы убедиться, что для некоторого среднего значения «звездочек» из исходной таблицы 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
Как вы думаете, в каких шагах я ошибся? Есть предложения, как бы вы это сделали?