我列出了一组学生,他们的学科,成绩以及每个学科的尝试量。由于有些学生多次尝试通过,因此重复了这些主题。我需要选择科目失败最多的学生,但我不能指望同一科目的重复失败,我只需要记住最后一次尝试。
+-----------+---------------+-----------+-------------+
| [ 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)
我需要学科失败最多的学生,而不是失败尝试最多的学生。
答案 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;
您的问题对您的需求含糊不清:
fetch first 1 row only
。where rownum = 1
。rank()
或dense_rank()
。