Вот моя схема:SQL- Поиск пользователей с максимальным средним баллом
create TABLE sample (
userId INT,
score INT
);
INSERT INTO sample VALUES (1,10);
INSERT INTO sample VALUES (1,15);
INSERT INTO sample VALUES (1,20);
INSERT INTO sample VALUES (2,100);
INSERT INTO sample VALUES (2,200);
INSERT INTO sample VALUES (2,500);
INSERT INTO sample VALUES (4,100);
INSERT INTO sample VALUES (4,200);
INSERT INTO sample VALUES (4,500);
INSERT INTO sample VALUES (3,5);
INSERT INTO sample VALUES (3,5);
INSERT INTO sample VALUES (3,10);
INSERT INTO sample VALUES (3,7);
INSERT INTO sample VALUES (3,2);
Я хочу, чтобы найти идентификатор пользователя и тех, кто имеет максимальную высокий средний балл. Обратите внимание, что может быть больше одного! Таким образом, для приведенных выше выборочных данных ответ будет: 2 и 4, потому что они оба имеют средний балл 266,666 ....
У меня есть рабочий SQL для этой проблемы:
select s.USERID
from sample s
group by USERID
having AVG(s.SCORE) IN (
-- Gets the Maximum Average Score (returns only 1 result)
select MAX(average_score) as Max_Average_Score
from (
-- Gets the Average Score
select AVG(s2.SCORE) as average_score
from sample s2
group by USERID
)
);
Но я думаю, что это немного неэффективно, потому что я расчет среднего балла в два раз. Один раз для основного SQL и снова для поиска максимума avg. Есть ли способ лучше?
Примечание: Я использую SQL Plus
увидеть это: HTTP: // stackoverflow.com/questions/10557897/sql-getting-a-maxavgcolumn –
Поддерживает ли каждый пользователь имеют такое же количество записей? Если да, то вы можете просто использовать СУММ, а не AVG, который может быстрее вычислить ... – mlinth
Нет, это может быть иначе. Мое сообщение будет отредактировано. –