#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
заполнить все выбранные поля для правильного результата.