[英]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.