MySQL查询最近2次尝试的平均值

时间:2011-12-15 18:35:04

标签: mysql

我有一张桌子:

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

4 个答案:

答案 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