我有一张桌子
CREATE TABLE event
uuid character varying(50),
created timestamp without time zone DEFAULT now(),
event_type character varying(50))
数据就是这样
我需要获取每个uuid为“ NotSaved”或“ Saved”的最新event_type 就像在这种情况下,已保存的uuid_1234和未保存的uuid_1235。 我尝试使用distinct,子查询和max,但未给出正确的结果
答案 0 :(得分:0)
使用row_number()
select * from
(
select *,row_number() over(partition by uuid order by createdtimestamp desc) rn
from event
) a where a.rn=1
及以下版本也可以
SELECT DISTINCT ON (uuid )
uuid , createdtimestamp
FROM event
ORDER BY event_timestamp DESC
答案 1 :(得分:0)
执行此操作的一种方法是将表与其自身连接。 首先,创建select语句以提取uuid和指定所需事件类型的最新创建日期。
select uuid, max(created)
from event
where event_type in ('NotSaved', 'Saved')
请注意,在此语句中我们无法获得event_type列(或任何其他列)。只有uuid,以及创建的最大值。
然后,使用此select语句作为“内联表”,将事件表连接到该表以获取剩余的列。
select distinct e.uuid, e.created, e.event_type
from event e
inner join (select uuid, max(created)
from event
where event_type in ('NotSaved', 'Saved')) maxe
on e.uuid = maxe.uuid and e.created = maxe.created;
我们给内联表一个别名maxe,因为它实际上并不存在,我们需要一种引用它的方法。事件表的别名e只是为了方便起见,它使连接条件的键入和读取更加容易。