Как выбрать только те звания, которые встречаются один раз, кроме первого? - PullRequest
0 голосов
/ 09 марта 2020

У меня есть 2 таблицы. Таблица1: студент

enter image description here

Таблица2: проблема

enter image description here

Теперь нам нужно выяснить, какой студент решил, сколько проблем, и в выводе нам нужно отобразить student_id, student_name и no_of_prob в порядке убывания no_of_prob.

Если более одного студента имеют равные количество проблем тогда 1. Если no_of_prob самый высокий среди всех остальных, то сохраните их все. 2. Если no_of_prob не самый высокий, не сохраняйте ничего из этого. Например, когда мы группируем по student_id, мы получаем это

enter image description here

Так как student_id 2 и 5 имеют равные no_of_prob, но поскольку их no_of_prob наивысший, мы будем оставьте и student_id 2 и 5. Но student_id 1 и 3 имеют равные no_of_prob, но они не самые высокие, поэтому нам нужно отбросить оба из них. Финальный стол должен быть таким:

enter image description here

Теперь я узнал, как добраться до таблицы № 3 выше, но я не знаю, как Должен ли я оставить 1-й ряд, но убрать его, если он будет повторен? Это мой код ниже

select s.student_id,student_name, count(problem_id) as no_of_prob,
rank() over(order by count(problem_id) desc) as st_rank
from student s inner join problem p on s.student_id = p.student_id
group by s.student_id;

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Вы можете использовать функцию RANK() для получения первых ранкеров вместе со строками, имеющими в подзапросе количество, равное 1.

SELECT student_id, 
       student_name, 
       no_of_prob 
FROM   (SELECT p.student_id,student_name, 
               COUNT(*) AS no_of_prob, 
               RANK() OVER(ORDER BY COUNT(*) DESC) rk 
        FROM   problem p 
               JOIN student s ON p.student_id = s.student_id 
        GROUP  BY p.student_id,student_name 
        ORDER  BY COUNT(*) DESC) a 
WHERE  rk = 1 OR no_of_prob = 1     

Проверить демонстрацию здесь

Выход

enter image description here

0 голосов
/ 09 марта 2020

Попробуйте этот запрос. Надеюсь, все будет хорошо.

SELECT p.student_id,s.student_name,count(*) as no_of_prb 
FROM `problem` p 
left join student s on p.student_id=s.student_id 
group by p.`student_id` 
having 
     no_of_prb not in (select count(*) as total from problem group by student_id having total>1)
     OR 
     no_of_prb = (select count(*) as total from problem group by student_id order by total desc limit 1)
order by no_of_prb desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...