Мне нужен студент с самыми неудачными предметами, основанный только на его последнем поступлении - PullRequest
1 голос
/ 23 марта 2019

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

+-----------+---------------+-----------+-------------+
| [ name ]  |  [ subject ]  | [ grade ] | [ attempt ] |
+-----------+---------------+-----------+-------------+
| [ Peter ] | [ math ]      | [ 6 ]     | [ 1 ]       |
| [ Peter ] | [ math ]      | [ 7 ]     | [ 2 ]       |
| [Jessica] | [ chemistry ] | [ 8 ]     | [ 1 ]       |
| [Jesicca] | [ spanish ]   | [ 9 ]     | [ 1 ]       |
+-----------+---------------+-----------+-------------+

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

Select 
    a.name, count(am.subject), am.attempt
from
    alumnos a, alumnos_materias am
where 
    a.i_alumn = am.i_alumn and
    (am.attempt = (select max(attempt)
                   from alumn_subject))
group by 
    a.name, am.attempt
having 
    am.i_subject = (select i_subject
                    from  alumn_subject
                    where grade < 7)

Мне нужен студент с самыми неудачными предметами, не большинство попыток провалилось.

Ответы [ 2 ]

2 голосов
/ 23 марта 2019

Как насчет использования предложения HAVING, чтобы получить людей с ошибочными предметами.

Тогда получите первую 1 с наибольшим количеством ошибок из этого.

SELECT 
 a.name, 
 COUNT(fails.subject) AS total_failed_subjects
FROM 
(
   SELECT i_alumn, subject
   FROM  alumnos_materias
   GROUP BY i_alumn, subject
   HAVING MAX(grade) <= 6
) fails
JOIN alumnos a ON a.i_alumn = fails.i_alumn
GROUP BY a.i_alumn, a.name
ORDER BY COUNT(fails.subject) DESC
FETCH FIRST 1 ROWS ONLY;

Тест на db <> fiddle здесь

Но если вам действительно нужна последняя попытка?
Тогда вы можете использовать ROW_NUMBER, чтобы отфильтровать это перед подсчетом неудач.

SELECT 
 a.name, 
 COUNT(fails.subject) AS total_failed_subjects
FROM 
(
   SELECT i_alumn, subject, grade, attempt,
   ROW_NUMBER() OVER (PARTITION BY i_alumn, subject ORDER BY attempt DESC) AS rn
   FROM  alumnos_materias
) fails
JOIN alumnos a ON a.i_alumn = fails.i_alumn
WHERE rn = 1 AND grade <= 6
GROUP BY a.i_alumn, a.name
ORDER BY COUNT(fails.subject) DESC
FETCH FIRST 1 ROWS ONLY;
0 голосов
/ 23 марта 2019

Как насчет использования условного агрегирования? Получить заказ студентов по количеству неудач

select a.name,
       count(distinct case when grade < 7 then subject end) as num_failed_subjects
from alumnos a join
     alumnos_materias am
     on a.i_alumn = am.i_alumn
group by a.name
order by num_failed_subjects desc;

Ваш вопрос немного расплывчат в том, что вам нужно:

  • Если вам нужен только один студент и у вас последняя версия Oracle, используйте fetch first 1 row only.
  • Если у вас более старая версия Oracle, оберните ее в подзапрос и используйте where rownum = 1.
  • Если вам нужны все учащиеся с одинаковым количеством неудач, оберните их в подзапрос и используйте rank() или dense_rank().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...