【发布时间】:2015-01-17 03:30:59
【问题描述】:
这是我的架构:
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);
我想找出平均分最高的用户的用户 ID。注意可能不止一个!所以对于上面的样本数据,答案是: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,再次用于查找最大平均分数。有没有更好的办法?
注意:我使用的是 SQL Plus
【问题讨论】:
-
每个 userId 的记录数是否相同?如果是这样,那么您可以只使用 SUM 而不是 AVG,这可能会计算得更快...
-
不,它可以不同。我的帖子将被编辑。