PostgreSQL为所有用户获取最新的行/事件

时间:2015-06-16 13:09:09

标签: sql join greatest-n-per-group amazon-redshift

使用PostgreSQL 8.x(AWS Redshift)

我有这样的数据库结构:

userId: varchar, tstamp: datetime, event: string

所以,让我说我有以下几行

u2, t1, e1

u1, t2, e2

u2, t3, e1

u1, t4, e2

其中u1和u2是用户ID,t [1..4]是时间戳,其中t1> t2> t3> t4 e1和e2是事件的类型。

那么我如何获得所有用户执行的最新事件。所以查询的输出将是:

u2, t3, e1

u1, t4, e2

试图理解使用: https://en.wikipedia.org/wiki/Correlated_subqueryPostgreSQL Selecting Most Recent Entry for a Given ID

但我觉得这是一个慢脑。无法得到它。

2 个答案:

答案 0 :(得分:14)

您可以使用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

答案 1 :(得分: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);