2015-07-14 1 views
0

В следующем ERDвключают в себя первый и последние группы в запросе приводит к

enter image description here

assessment представляет собой тест завершен пользователем. Каждая оценка состоит из нескольких предметов, а level показывает их оценку по каждому.

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

я могу получить средний балл для каждой оценки с

SELECT a.user_id, 
    a.date_created, 
    avg(ai.level) 
FROM assessment a 
    JOIN assessment_item ai ON a.id = ai.assessment_id 
GROUP BY a.user_id, a.date_created 
ORDER BY 1; 

Этот запрос возвращает данные, такие как

user_id, date_created,   avg_score 
10,  "2015-07-13 18:09:59", 3.0000 
11,  "2015-07-13 18:09:59", 3.0000 
13,  "2015-07-13 18:26:00", 2.0000 
13,  "2015-07-13 18:27:28", 6.0000 
13,  "2015-07-13 19:04:58", 3.0000 

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

+0

вы можете разместить скрипт sql? –

ответ

1

Вероятно, самый простой способ заключается в использовании substring_index()/group_concat() трюк:

SELECT user_id, 
     substring_index(group_concat(levavg order by date_created), ',', 1) as first_avg, 
     substring_index(group_concat(levavg order by date_created desc), ',', 1) as lasst_avg, 
FROM (SELECT a.user_id, a.date_created, avg(ai.level) as levavg 
     FROM assessment a JOIN 
      assessment_item ai 
      ON a.id = ai.assessment_id 
     GROUP BY a.user_id, a.date_created 
    ) ua 
GROUP BY user_id 
HAVING COUNT(*) > 1 
ORDER BY 1; 
+0

Спасибо, это почти то, что мне нужно, но оно включает в себя результаты от пользователей, которые только завершили одну оценку, и я не могу сказать, действительно ли у них есть несколько оценок с одинаковым средним счетом или только с одной оценкой. Можно ли добавить счет оценки к запросу? –

+0

@ AntonioDragos. , , Если вам просто нужны пользователи с несколькими оценками, добавьте предложение 'having'. –

0

EXISTS карапуз помощь! (Первая запись не имеет предыдущую запись, последняя запись не имеет следующую запись, выходы дает логическое, который можно сравнить)

[тестировался, так как у меня нет тестовых данных]

SELECT a.user_id 
    , a.date_created 
    , avg(ai.level) 
FROM assessment a 
JOIN assessment_item ai ON a.id = ai.assessment_id 
WHERE EXISTS (SELECT * FROM assessment xx 
       WHERE xx.user_id = a.userid 
       AND xx.date_created < a.date_created 
       ) 
     <> EXISTS (SELECT * FROM assessment xx 
       WHERE xx.user_id = a.userid 
       AND xx.date_created > a.date_created 
       ) 
GROUP BY a.user_id, a.date_created 
ORDER BY 1, 2; 
Смежные вопросы