Максимальный балл в теме с фамилией сотрудника - PullRequest
0 голосов
/ 30 мая 2020

Напишите запрос для отображения списка сотрудников, имени обработанного предмета, максимальной оценки по этому предмету. Укажите псевдоним максимальной отметке как max_mark. Отсортируйте результат по максимальной отметке в порядке убывания.

Это диаграмма схемы.

enter image description here

Это код, который я пробовал .

select distinct
       staff_name,
       subject_name,
       max(value) over (partition by sb.staff_id) as max_mark
from   subject sb
       inner join staff st
       on st.staff_id=sb.staff_id
       inner join mark m
       on m.subject_id=sb.subject_id
order by max_mark desc;

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

Ответы [ 3 ]

0 голосов
/ 30 мая 2020

Похоже, Вы ищете следующий запрос:

SELECT
    ST.STAFF_NAME,
    SB.SUBJECT_NAME,
    MAX(M.VALUE) AS MAX_MARK
FROM
    STAFF     ST
    JOIN SUBJECT   SB ON SB.STAFF_ID = ST.STAFF_ID
    JOIN MARK      M ON M.SUBJECT_ID = SB.SUBJECT_ID
GROUP BY
    ST.STAFF_ID,
    ST.STAFF_NAME,
    SB.SUBJECT_ID,
    SB.SUBJECT_NAME
ORDER BY
    MAX_MARK DESC;
0 голосов
/ 30 мая 2020

Вы можете использовать оконные функции:

select staff_name, subject_name, max_mark
from (select st.staff_name, su.subject_name, ma.value as max_mark,
             row_number() over (partition by st.staff_name order by ma.value desc) as seqnum
      from subject su join
           staff st
           on st.staff_id = sb.staff_id join
           mark ma
           on ma.subject_id = su.subject_id 
     ) s
order by max_mark desc;

Вы также можете использовать свой метод (select distinct с оконными функциями). . . но вам придется иметь дело с subject_name:

select distinct staff_name,
       first_value(subject_name) over (partition by sb.staff_id order by value desc) as subject_name
       max(value) over (partition by sb.staff_id) as max_mark
from   subject sb
       inner join staff st
       on st.staff_id=sb.staff_id
       inner join mark m
       on m.subject_id=sb.subject_id
order by max_mark desc;
0 голосов
/ 30 мая 2020

Я думаю, что вам нужна агрегация:

select  
    st.staff_name,
    su.subject_name,
    max(ma.value) as max_mark
from subject su
inner join staff st on st.staff_id   = sb.staff_id 
inner join mark ma  on ma.subject_id = su.subject_id 
group by st.staff_id, st.staff_name, su.subject_id, su.subject_name
order by max_mark desc;
...