Взятие одной записи из group by без ручного ввода всех столбцов

#sql #hiveql #presto

#sql #hiveql #presto

Вопрос:

У меня есть таблица со следующим столбцом:

 id, col_1, col_2, col_3, .... col_1000, timestamp
  

Я хочу иметь только одну запись для каждого идентификатора, используя последнюю временную метку. То есть мой запрос будет:

 select id, max_by(col_1, timestamp), max_by(col_2, timestamp), max_by(col_3, timestamp), ... max_by(col_1000, timestamp), max_by(timestamp, timestamp) group by id
  

Поскольку столбцов так много, мне интересно, есть ли способ, которым я мог бы сделать что-то вроде:

 select max_by(*, timestamp) group by id
  

Так что мне не нужно вручную вводить все столбцы? Спасибо!

Ответ №1:

Хммм … Вы можете использовать row_number() :

 select t.*
from (select t.*,
             row_number() over (partition by id order by timestamp desc) as seqnum
      from t
     ) t
where seqnum = 1;
  

Вы также можете выразить это с помощью коррелированного подзапроса или join :

 select t.*
from t join
     (select id, max(timestamp) as max_timestamp
      from t
      group by id
     ) tt
     on t.id = tt.id and t.timestamp = tt.max_timestamp