我只需要根据他的最后一次通过才可以选出最失败的科目

时间:2019-03-23 05:36:46

标签: sql oracle

我列出了一组学生,他们的学科,成绩以及每个学科的尝试量。由于有些学生多次尝试通过,因此重复了这些主题。我需要选择科目失败最多的学生,但我不能指望同一科目的重复失败,我只需要记住最后一次尝试。

+-----------+---------------+-----------+-------------+
| [ 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 个答案:

答案 0 :(得分:2)

如何使用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 <>小提琴here

的测试

但是,如果您真的需要最后一次尝试吗?
然后,您可以在计数失败之前使用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;

答案 1 :(得分:0)

如何使用条件聚合?按照失败次数获得学生订单

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()