簡體   English   中英

SQL-查找具有最高平均分數的用戶

[英]SQL- Finding the users with the Maximum average score

這是我的架構:

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

select userid from
(select userid, rank() over (order by avg(score) desc) rw
from sample group by userid)
where rw = 1;

計算每個用戶的平均得分,然后使用分析功能(在分組后執行)計算每個得分的排名。 最后獲得排名第一的行

我只能說我將如何使用DB2 SQL解決此問題,我將創建一個臨時表,您可以在其中保存每個用戶的平均分數並從中選擇最大值。 這也可以在sql plus中實現: 如何在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)

Listo,更改為Oracle:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM