Как выбрать последние записи для отдельных значений столбца? - PullRequest
0 голосов
/ 20 февраля 2019

В моей базе данных есть идентификаторы профиля со статусами, которые также имеют временную метку.Я хочу иметь последний статус для каждого профиля с помощью запроса.Как я могу сделать это самым простым способом?

Так что для:

Id      Profile  Timestamp
-------------------------
1        1       1550588089
2        1       1550588099
3        3       1550588183
4        4       1550588333
5        4       1550588534
6        4       1550588377

Я хочу иметь

Id      Timestamp
-------------------------
2       1550588099
3       1550588183
5       1550588534

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

используйте row_number(), которые поддерживают максимальные дБмс

 select * from 
(
 select *,row_number() over(partition by Id order by timestamp desc) rn
 from table
) t where t.rn=1
0 голосов
/ 20 февраля 2019

Этот запрос:

select profile, max(timestamp) maxtimestamp 
from tablename
group by profile 

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

select id, timestamp
from tablename t
inner join (
  select profile, max(timestamp) maxtimestamp 
  from tablename
  group by profile 
) g
on g.profile = t.profile and g.maxtimestamp = t.timestamp

См. демо

0 голосов
/ 20 февраля 2019

Вы можете использовать коррелированный подзапрос

DEMO

select id as status, Timestamp
from tablename a where timestamp in (select max(timestamp) from tablename b where a.profile=b.profile )

ВЫХОД:

tatus   Timestamps
2       1550588099
3       1550588183
5       1550588534

ИЛИ вы можете использовать row_number()

select * from 
(
select *, row_number() over(partition by profile order by timestamp desc) as rn
from tablename
)A where rn=1
...