我有一张桌子:
quiz userid attempt grade
1 3 1 33
2 3 1 67
1 3 2 90
10 3 4 20
2 3 2 67
1 3 3 55
现在,对于第一次测验,用户给出了3次尝试,即(33,90,55),现在我需要该scormid和userid的最后2次尝试的平均值((90 + 55)/ 2)
现在,我想要最后两次尝试,即4和3,我想要这两个等级的平均等级,即90和20 需要OP喜欢
userid
quiz
No.of Attempts
Grade
3 1 3 (90+55)/2 i.e., 72.5
3 2 2 (67+67)/2 i.e., 67
3 10 1 20
答案 0 :(得分:6)
首先,您需要选择具有最高尝试次数的两行,这是子查询的作用,然后对派生表中的等级进行平均。
SELECT
AVG(grade)
FROM (
SELECT
grade
FROM
`table`
ORDER BY attempt DESC
LIMIT 2
) t;
这将为您提供55.0000
的结果,这是90和20的平均值,即最后两次尝试的等级。
答案 1 :(得分:1)
SELECT AVG(grade), attempt
FROM table
GROUP BY attempt
ORDER BY attempt DESC
LIMIT 2
答案 2 :(得分:0)
试试这个(假设你的桌子被称为'成绩')
SELECT last_two_grades.userid, last_two_grades.quiz, AVG(last_two_grades.grade) AS average
FROM (
SELECT grades.userid, grades.quiz, grades.grade
FROM grades
ORDER BY grades.attempt DESC
LIMIT 2
) AS last_two_grades
GROUP BY last_two_grades.userid, last_two_grades.quiz
通过它,您可以选择每个用户的最后两个成绩的平均值。如果要为特定用户选择它,可以通过添加
来实现HAVING last_two_grades.userid = 3
到查询结尾,对于某个测验,您可以添加
HAVING last_two_grades.quiz = 1
要获得某个测验中用户的平均成绩,您必须指定
HAVING last_two_grades.quiz = 1 AND last_two_grades.userid = 3
答案 3 :(得分:0)
做出2个假设:你所有的尝试都是顺序的并且没有空洞(即1,2,3,4)存在而不是1,3,4,6)如果是后者,我可以纠正。 (将使用限制/下降顺序)
假设您希望每人/每个测验获得2个等级的平均值。
说明: 执行一个子查询:get quiz,用户,其中try尝试等于同一测验/用户的最大尝试次数减少1.性能不理想可能有更快的方法,但这可以解决问题。
SELECT T1.quiz, T1.userID, avg(T1.grade)
FROM TABLE T1
T1.Attempt >=
(Select max(T3.attempt) -1
from table T3
where T3.QUIZ=T1.Quiz
AND T3.UserID=T1.UserID)
GROUP BY T1.Quiz, T1.UserID