使用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_subquery 和 PostgreSQL Selecting Most Recent Entry for a Given ID
但我觉得这是一个慢脑。无法得到它。
答案 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);