2011-12-15 2 views
1

У меня есть таблица:MySQL Query для Average последних 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) для этого scorid и userid тоже

Теперь, мне нужны последние две попытки, т. е. 4 и 3, и я хочу, чтобы средний класс этих 2 классов, т.е. 90 и 20 Нужно ОП, как

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

У вас есть больше пользователей или викторины? Если да, то как это должно быть обработано? –

+0

Что случилось с ответом @rich_adams? Если вы не получите его, вы можете добавить это к вопросу, но он выглядит хорошо, не так ли? – Nanne

+0

В запросе Rich Adams я получаю только одну строку, но я должен получить все строки для викторины – user1067018

ответ

6

Прежде всего, необходимо выбрать только два ряда с высокими попыток, что является то, что делает подзапрос, а затем усреднять оценки от производной таблицы.

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

Это даст вам результат 55.0000, который в среднем 90 и 20, то оценки за последние две попытки.

+0

Зачем использовать подзапрос, если вы можете использовать оператор GROUP BY? –

+0

Поскольку GROUP BY покажет вам среднее значение для каждого значения попытки, а не комбинированное среднее значение, которое, как мне кажется, требуется OP (хотя это может и не быть тем, что им нужно). –

+0

OP хочет получить средние значения за попытку, я думал –

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

это не даст решения –

+0

Привет, ребята, мне нужно показать только последние две попытки, пожалуйста, чтобы я мог попробовать для avg – user1067018

1

Выбор последних двух строк = выбор первых двух строк реверсивного набора.

Просто закажите attempt DESC (это делает его 4,3,2,1), а затем возьмите первые два (4,3).

SELECT * FROM table WHERE <...> ORDER BY attempt DESC LIMIT 2

+0

Привет, Том, Давайте работать над вашим предложением SELECT userid, quiz, попытка, AVG (оценка) FROM mdl_scorm_scoes_track ЗАКАЗАТЬ BY попытка DESC LIMIT 2 Он отображает неправильное процентное значение (я думаю, что он принимает все 3 попытки в среднем, но мне нужны только последние две попытки – user1067018

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

Выход отображается, как этот средний средний показатель для пользователей 3 662019123 только одна строка – user1067018

+0

Конечно. Вы хотите знать средние оценки двух последних попыток пользователя? почему вы ожидаете более одной строки для каждого пользователя? О, и я просто видел, что попытки могут быть одинаковыми значениями для одного пользователя, поэтому вы должны указать критерии другого порядка (соответственно по группе или где) ... Я думаю, что викторина - это то, что нужно ... – Vapire

+0

Только что отредактировал мой ответ для поддержки столбца викторины, а также – Vapire

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 
+0

Привет xObert, у меня нет еще одной таблицы, так как все в одной таблице – user1067018

+0

В обоих случаях таблица одинакова: ее подзаголовок, чтобы получить максимальную попытку на пользователя за викторину. (используйте одно и то же имя в обоих местах).Поэтому, если ваше имя таблицы SCORES: затем замените таблицу SCORES в обоих местах. – xQbert

+0

Это ошибка, которую я получаю при выполнении запроса «# 1064 - У вас есть ошибка в синтаксисе SQL, проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с« T1.attempt > = (SELECT MAX (T3.attempt) -1 FROM mdl_scorm_scoes_track T3 'в строке 3 – user1067018

Смежные вопросы