2011-12-15 34 views
1

我有一個表:MySQL查詢去年2次嘗試的平均

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 

現在對於第一次測驗,一個用戶給3attempts即(33,90,55),現在我需要的平均去年2嘗試((90 + 55)/ 2)該scormid和userid

現在,我想最後兩次嘗試,即4和3,我希望這兩個等級的平均等級,即90和20 需要OP如

useridquizNo.of AttemptsGrade

3  1   3   (90+55)/2 i.e., 72.5 
3  2   2   (67+67)/2 i.e., 67 
3  10  1    20 
+1

您是否有更多的用戶或測驗?如果是這樣,那應該如何處理? – 2011-12-15 18:53:59

+0

@rich_adams的回答有什麼問題?如果你沒有得到它,你可能想補充一點,但它看起來不錯,不是嗎? – Nanne 2011-12-18 12:47:45

+0

在Rich Adams查詢中,Iam只獲取一行,但我應該獲取測驗的所有行 – user1067018 2011-12-18 16:09:54

回答

6

首先,你需要選擇的只是兩行具有最高的嘗試,這是子查詢做什麼,然後平均派生表的成績。

SELECT 
    AVG(grade) 
FROM (
     SELECT 
      grade 
     FROM 
      `table` 
     ORDER BY attempt DESC 
     LIMIT 2 
    ) t; 

這會給你的55.0000的結果,這是90和20的平均成績在過去的兩次嘗試。

+0

爲什麼使用子查詢如果您可以使用GROUP BY語句? – 2011-12-15 18:41:53

+0

因爲GROUP BY會顯示每個嘗試值的平均值,而不是綜合平均值,這是我認爲OP所需的值(儘管這可能不是他們之後的值)。 – 2011-12-15 18:46:15

+0

OP想要每次嘗試的平均數,我認爲 – 2011-12-15 18:51:48

1
SELECT AVG(grade), attempt 
FROM table 
GROUP BY attempt 
ORDER BY attempt DESC 
LIMIT 2 
1

選擇最後兩行=選擇反轉集合的前兩行。

只需通過attempt DESC(使其爲4,3,2,1)然後抓取前兩個(4,3)。

SELECT * FROM table WHERE <...> ORDER BY attempt DESC LIMIT 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 
0

使2的假設:你嘗試是連續的,沒有空隙(即1,2,3,4)存在,而不是1,3,4, 6)如果後者,我可以糾正。 (將使用限制/順序降序)

假設您想要每個人/每次測驗的2個等級的平均值。

解釋: 執行一個子查詢:獲取測驗,用戶嘗試等於最大嘗試的同一測驗/用戶少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