PASS и FAIL записывают один и тот же тест - PullRequest
0 голосов
/ 23 мая 2018

SQL новичок здесь.Я пытался найти, но не смог найти этот сценарий.

Для определенного экзамена студенты могут иметь несколько записей (Pass, Fail, No-Show, Dropped).

results table

Student_ID  Exam_ID    Status     Time_stamp

   1          A       Passed      2018-05-01
   2          A       Failed      2018-05-01
   2          A       Passed      2018-05-05  
   3          A       No-Show     2018-05-01
   3          A       Failed      2018-05-05
   4          A       Passed      2018-05-01
   4          A       Failed      2018-05-25

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

Например, в примерах данных student_id 1 = передано, student_id 2 = пройдено (одна запись прохождения = передано) и student_id 3 = не выполнено (нет записей прохождения, произошла ошибка после неявки), student_id 4 = пройдено(одна запись прохождения на экзамене = сдать, игнорировать позже не получится)

Пока я пробовал это -

SELECT * 
FROM results
WHERE Status = "Passed"

Но это, очевидно, не включает в себя статус не пройден.

Очень ценю помощь.

Ответы [ 4 ]

0 голосов
/ 23 мая 2018

Оптимизированная версия

with t (Student_ID, Exam_ID, Status, Time_stamp) as ( select 1, 'A', 'Passed', '2018-05-01' union all select 2, 'A', 'Failed', '2018-05-01' union all select 2, 'A', 'Passed', '2018-05-05' union all select 3, 'A', 'No-Show', '2018-05-01' union all select 3, 'A', 'Failed', '2018-05-05' union all select 4, 'A', 'Passed', '2018-05-01' union all select 4, 'A', 'Failed', '2018-05-25') select * from (select *,row_number() over(PARTITION BY student_id,exam_id order by case when status='Passed' then 1 when status='Failed' then 2 when status='No-Show' then 3 end, time_stamp desc) r from t) result where r=1

0 голосов
/ 23 мая 2018

Ссылка ниже почти такая же.Используйте некоторые тактики, и вы получите свой ответ

SQL-запрос, чтобы найти конкретное значение для всех записей

0 голосов
/ 23 мая 2018

Вы также можете сделать это, используя RANK:

SELECT student_id, exam_id, status, time_stamp
FROM
(
SELECT *, RANK() OVER(PARTITION BY student_id ORDER BY time_stamp DESC) AS rnk
FROM t
) sub
WHERE status = 'Passed'
OR (rnk = 1
    AND NOT EXISTS
    (SELECT 1
     FROM t t2
     WHERE status = 'Passed'
     AND t2.student_id = sub.student_id))

Таким образом, логика такова: возьмите записи, в которых передается статус ИЛИ (1) тест является самым последним для студента И (2)у студента нет сдачи теста.

0 голосов
/ 23 мая 2018

Вот один метод, использующий union all:

select r.*
from results r
where r.status = 'Passed'
union all
select t.*
from results r
where not exists (select 1 
                  from results r2
                  where r2.student_id = r.student_id and
                        r2.exam_id = r.exam_id and
                        r2.status = 'Passed'
                 ) and
      r.time_stamp = (select max(r2.time_stamp
                      from results r2
                      where r2.student_id = r.student_id and
                            r2.exam_id = r.exam_id 
                     );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...