【问题标题】:SQL- Finding the users with the Maximum average scoreSQL-查找平均分最高的用户
【发布时间】: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

【问题讨论】:

标签: sql oracle


【解决方案1】:
select userid from
(select userid, rank() over (order by avg(score) desc) rw
from sample group by userid)
where rw = 1;

计算每个用户的平均分数,然后使用分析函数(在分组后执行)计算每个分数的排名。最后得到排名第一的行

【讨论】:

    【解决方案2】:

    我只能说我将如何使用 DB2 SQL 解决这个问题 我会创建一个临时表,您可以在其中保存每个用户的平均分数并从中选择最大值。这在 sql plus 中也是可能的:How to create a temporary table in Oracle

    这是 DB2 语法中的解决方案(未测试)

    http://www.cs.newpaltz.edu/~pletcha/DB/db2_TempTables.html

    WITH tempTable 
    AS (select userid, AVG(score) FROM sample GROUP BY userid)
    
    SELECT * FROM tempTable WHERE score = (SELECT MAX(score) FROM tempTable)
    

    【讨论】:

    【解决方案3】:

    Listo,改为 Oracle:

    select userId, AVG(score) AS promedio 
    from [sample] 
    where rownum = 1
    group by userId
    order by AVG(score) desc
    

    【讨论】:

    • 这不是 Oracle 语法。
    • 有些不是英文的
    • [sample] 是无效的 SQL 标识符。
    • 另外,我希望所有用户的平均分最高,而不仅仅是 1。我也不确定 [sample] 是什么意思。这和样品一样吗?
    猜你喜欢
    • 2016-04-07
    • 2017-07-20
    • 1970-01-01
    • 2013-07-28
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 2021-06-18
    相关资源
    最近更新 更多