Застрял в запросе, используя в оракуле - PullRequest
0 голосов
/ 05 октября 2019

У меня есть таблица с именем student, в которой есть следующие строки и столбцы (year_id, dept_id - это внешний ключ от двух других таблиц поиска):

enter image description here

И у меня есть еще один результат таблицы, который содержит идентификатор студента (stu_id) и соответствующие оценки.

enter image description here

Так что каждыйВ этом году студенты связаны с четырьмя различными отделами. Мне нужно найти топпер каждого года обучения. Вот что я попробовал:

SELECT T2.year_id, 
       T2.dept_id, 
       Max(T2.per) PERCENTAGE 
FROM   (SELECT T1.id, 
               T1.first_name, 
               T1.year_id, 
               T1.dept_id, 
               T1.total, 
               ( T1.total / 300 ) * 100 PER 
        FROM   (SELECT S.stu_id                  ID, 
                       first_name, 
                       last_name, 
                       year_id, 
                       dept_id, 
                       eng, 
                       maths, 
                       science, 
                       ( eng + maths + science ) TOTAL 
                FROM   stu.student S, 
                       stu.result R 
                WHERE  S.stu_id = R.stu_id 
                ORDER  BY year_id, 
                          dept_id) T1) T2 
GROUP  BY year_id, 
          dept_id 
ORDER  BY year_id, 
          dept_id; 

Итак, я получил результаты каждого года, где каждый отделсамый высокий процент. enter image description here

Но я хотел также напечатать имя студента, набравшего наибольший процент. Так что я добавил group by id, но это не дает мне должного результата. Итак, как привестиимя студента в этом запросе?

Ответы [ 2 ]

1 голос
/ 05 октября 2019

Вы можете использовать аналитическую функцию следующим образом:

Select id, 
       first_name, 
       year_id, 
       dept_id, 
       total, 
       PER 
     from
       (SELECT T1.id, 
               T1.first_name, 
               T1.year_id, 
               T1.dept_id, 
               T1.total, 
               ( T1.total / 300 ) * 100 PER ,
               Dense_rank() over (partition by year_id, dept_id order by T1.total desc) as rn
        FROM   (SELECT S.stu_id  ID, 
                       first_name, 
                       last_name, 
                       year_id, 
                       dept_id, 
                       eng, 
                       maths, 
                       science, 
                       ( eng + maths + science ) TOTAL 
                FROM   stu.student S, 
                       stu.result R 
                WHERE  S.stu_id = R.stu_id) T1) where rn = 1;

- обновление -

Вы можете добиться этого, используя join и cte с группой, следующим образом:

With T1 as
(SELECT S.stu_id  ID, 
        first_name, 
        last_name, 
        year_id, 
        dept_id, 
        eng, 
        maths, 
        science, 
        ( eng + maths + science ) TOTAL 
 FROM   stu.student S, 
        Join stu.result R 
        On (S.stu_id = R.stu_id))
Select S.ID, S.FIRSTNAME, T2.YEAR_ID, T2.DEPT_ID,
       T2.TOTAL, T2.TOTAL/3 AS PER
FROM
(Select year_id, 
       dept_id,
       Max(total) as total
From t1
Group by year_id, 
        dept_id) T2
JOIN T1 ON (T2.TOTAL = S.TOTAL
            AND T2.DEPT_ID = S.DEPT_ID
            AND T2.YEAR_ID = S.YEAR_ID);

Ура !!

0 голосов
/ 05 октября 2019

Вы, похоже, хотите JOIN и оконные функции:

SELECT sr.*
FROM (SELECT s.*, r.eng, r.maths, r.science,
             ( eng + maths + science ) * 100 / 300 as percentage,
             RANK() OVER (PARTITION BY s.year_id, s.dept_id ORDER BY ( eng + maths + science )) as seqnum
      FROM stu.student s JOIN
           stu.result r
           ON s.stu_id = r.stu_id 
     ) sr
WHERE seqnum = 1
ORDER BY s.year_id, s.dept_id;

Примечание: здесь используется RANK(), поэтому вы можете видеть, когда несколько студентов связаны в одном отделе иодин год.

Также используется правильный явный синтаксис standard JOIN: Никогда не используйте запятые в предложении FROM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...