#sql #postgresql
#sql #postgresql
Вопрос:
StudentName Height DateofEntry PlaceofRecording
Dani 180 1-1-2019 NYC
Dani 181 1-30-2019 Austin
Robbie 150 5-3-2017 LA
Robbie 155 4-3-2019 Atlanta
Robbie 155 4-10-2019 LA
...
Я хочу найти для каждого учащегося их максимальную высоту, самую последнюю дату ввода этой максимальной высоты и место записи.
Например:
Я хочу, чтобы мой запрос возвращал:
Dani 181 1-30-2019 Austin
Robbie 155 4-10-2019 LA
До сих пор я пробовал это:
select StudentName, max(height), max(dateofentry) from table group by 1
Но я не уверен, как извлечь правильную соответствующую дату ввода и место записи. В примере Робби, поскольку его значение высоты одинаково в двух строках, мне нужна строка с самой последней датой ввода.
Ответ №1:
Я думаю distinct on
, что это лучший подход:
select distinct on (studentname) t.*,
from t
order by t.studentname, t.height desc, t.date desc
Ответ №2:
Используется row_number()
для присвоения номеров каждой записи для каждого учащегося, отсортированных по убыванию высоты и дате записи по убыванию.
SELECT studentname,
height,
dateofentry,
placeofrecording
FROM (SELECT studentname,
height,
dateofentry,
placeofrecording,
row_number() OVER (PARTITION BY studentname
ORDER BY height DESC,
dateofentry DESC) rn
FROM elbat) x
WHERE rn = 1;
Ответ №3:
Вы можете использовать подзапрос
select q.*
from table
where (StudentName, Height, DateofEntry) in
(
select StudentName, max(height), max(dateofentry)
from table
group by StudentName
) q
Комментарии:
1. Как насчет PlaceofRecording?