Postgres查询以在一组值中查找特定元素

时间:2019-07-25 12:14:55

标签: postgresql subquery greatest-n-per-group

我有此表box,其中包含以下条目:

 eventid | uuid | rack           
---------+------+----
0        | 0    | r1
1        | 1    | r2
2        | 0    | r2

其中uuid是恒定的,每次发生在特定盒子上的更新都会添加一个带有新事件ID的新事件,但uuid仍然存在。

我想做的是找出一种根据特定机架获得最新版盒子的方法。

当我搜索机架r2时,我需要eventid 2和1,而当我搜索机架r1时,我什么也不想找到。

到目前为止,我有以下查询:

select distinct on (uuid) * 
from dbo.box as t 
where t ==> 'r2' 
order by t.uuid, t.eventid DESC;

哪个返回r2的正确数据,但是如果我将此查询与r1一起使用,当我什么都不想要时,我将得到eventId 0。

我假设您需要为此进行某种子查询,以基于事件ID获取所有最新版本的uuid,然后执行where子句,但我不太熟悉Postgres,所以如果任何人都可以帮助我,我将非常感激。

1 个答案:

答案 0 :(得分:0)

好吧,我没有您的扩展运算符(==>现在我需要了解它的操作)。因此,我无法测试以下内容,但可能值得尝试。您可以在where子句中添加NOT EXISTS谓词。

select distinct on (uuid) * 
from dbo.box as t 
where t ==> 'r2' 
  and not exists
      (select null
         from dbo.box nt
        where nt.uuid = t.uuid
          and nt.eventid > t.eventid
      )
order by t.uuid, t.eventid DESC; 

关于您的评论,我不确定它是否有意义。