如何根据多个行值选择不同的记录?

时间:2019-03-27 15:45:20

标签: sql postgresql

我有一张桌子

CREATE TABLE event
  uuid character varying(50),
  created timestamp without time zone DEFAULT now(),
  event_type character varying(50))

数据就是这样

enter image description here

我需要获取每个uuid为“ NotSaved”或“ Saved”的最新event_type 就像在这种情况下,已保存的uuid_1234和未保存的uuid_1235。 我尝试使用distinct,子查询和max,但未给出正确的结果

2 个答案:

答案 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只是为了方便起见,它使连接条件的键入和读取更加容易。