найти самую низкую квалификацию студента из основной базы данных

#php #postgresql

#php #postgresql

Вопрос:

У меня есть база данных студентов, где у каждого студента есть несколько записей, основанных на всей его / ее квалификации.
Я хочу найти самую низкую квалификацию каждого учащегося соответственно.

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

 select student_id,qualification
from student
group by qualification
order by qualification ASC
  

Например: Исходная таблица

 1 SSC 50
1 HSC 60
2 SSC 80
2 HSC 60
2 Grad 50
3 HSC 70
4 SSC 70
4 Diploma 70
  

Ожидаемый результат

 1 SSC 50
2 SSC 80
3 HSC 70
4 SSC 70
  

Комментарии:

1. Если бы вы могли разделить qualification на qualification и value , тогда это стало бы проще.

2. не могли бы вы, пожалуйста, уточнить это?

3. можете ли вы показать структуру вашей базы данных

4. Преобразуйте квалификацию в числа. SSC 50 было бы 1050 и HSC 50 1250 аналогично HSC 60 было бы 1260 . Для Diploma 50 : 1350 и Diploma 70 : 1370 . ASC не могу распознать, что HSC является высшим образованием, а SSC средним.

5. Квалификация — это varchar с кодом предмета и квалификацией?

Ответ №1:

Если вы разделите данные на поле квалификации и поле оценки, то это простой вопрос использования MIN() . Вы должны GROUP BY использовать все поля в select, чтобы мы могли найти самую низкую квалификацию с помощью MIN() , затем объединить этот результат, чтобы получить другие соответствующие столбцы, например qualifications .

Я предполагаю, Diplomia что это недействительная квалификация?

 create table students (
  student_id int,
  qualification varchar(128),
  score int
);

insert into students (student_id, qualification, score)
values
(1, 'SSC', 50),
(1, 'HSC', 60),
(2, 'SSC', 80),
(2, 'HSC', 60),
(2, 'Grad', 50),
(3, 'HSC', 70),
(4, 'SSC', 70),
(4, 'Diploma', 70);
  

Затем простой запрос с MIN() — имейте в виду, что вам всегда приходится использовать GROUP BY при использовании агрегатной функции, например MIN() .

 SELECT * 
FROM students 
JOIN (
  SELECT student_id, MIN(score) as score
  FROM students
  GROUP BY student_id
) min_score USING (student_id, score)
WHERE qualification <> 'Diploma'
  

Вывод становится

 student_id  score   qualification
1           50      SSC
2           50      Grad
3           70      HSC
4           70      SSC
  

Посмотрите эту живую демонстрацию.

Комментарии:

1. есть ли способ, с помощью которого я также могу получать оценки с самой низкой квалификацией? Потому что я пытался добавить поле в свой запрос, но оно выдало мне несколько записей

2. Вероятно, вы можете отделить логику, поскольку оценки вычисляются из баллов. Имейте в виду, что вам нужно GROUP BY заполнить все выбранные поля для правильного результата.