2015-06-16 3 views
3

Работы на PostgreSQL 8.x (AWS Redshift)PostgreSQL получить последние строки/события для всех пользователей

У меня есть дб структура, как это:

userId: varchar, tstamp: datetime, event: string 

Так скажем, у меня есть следующие строки

u2, t1, e1 

u1, t2, e2 

u2, t3, e1 

u1, t4, e2 

где u1 и u2 UserIds, т [1..4] являются временными метками, где t1> t2> t3> t4 и e1 и e2 являются типами событий.

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

u2, t3, e1 

u1, t4, e2 

Пытались понять с помощью: https://en.wikipedia.org/wiki/Correlated_subquery и PostgreSQL Selecting Most Recent Entry for a Given ID

Но я думаю, м медленный мозг. Не удалось.

ответ

7

Вы можете сделать это с Postgres' DISTINCT ON:

select distinct on(userId) userId, tstamp, event 
from events 
order by userId, tstamp desc; 

Для Redshift, вы можете быть в состоянии this variant from one of my previous answers:

select userId, tstamp, event from (
    select userId, tstamp, event, 
    row_number() over (partition by userId order by tstamp desc) as rownumber 
    from events 
) foo 
where rownumber = 1 
+0

Heyy .. работает это на AWS Redshift. Извините, забыл упомянуть об этом. Distinct On не поддерживается :( –

+0

Обновленный ответ – beerbajay

+0

спасибо .. отлично работает .. –

1
select t1.userid, 
     t1.date, 
     t1.event 
from table t1 
where t1.date= (select max(t2.date) 
        from table t2 
        where t2.userid = t1.userid); 
Смежные вопросы