Агрегирование по нескольким полям с помощью текстового столбца

#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?