找到之前列中不存在的值

时间:2017-06-07 19:15:14

标签: sql postgresql

我希望找到上次扫描时没有出现错误的最新扫描。

scanid  | errorid | date                |state
--------|---------|---------------------|-----
   1    |    1    | 2016-01-01 00:00:00 | 9
   1    |    2    | 2016-01-01 00:00:00 | 9
   2    |    1    | 2016-01-02 00:00:00 | 9

对于上面的示例,我想在结果显示以下行:

scanid  | errorid | date                |state
--------|---------|---------------------|-----
   2    |    2    | 2016-01-02 00:00:00 | 10

因此,scanid 2不会重复errorid 2,我也需要将此行的状态更改为10,而不是最新扫描的一部分。

我尝试过使用NOT IN和EXISTS但没有获得预期的记录。

我使用PostgreSQL作为我的数据库。

1 个答案:

答案 0 :(得分:0)

要查找最高和第二高的扫描ID,请使用DENSE_RANK对其进行排名。然后使用NOT EXISTS子句获取上一次扫描中没有匹配的最后扫描记录。

with ranked as
(
  select
    scanid, errorid, date, state, dense_rank() over(order by scanid desc) as rnk
  from scans
)
select scanid, errorid, date, state + 1
from ranked lastscan
where rnk = 1
and not exists
(
  select *
  from ranked prevscan
  where prevscan.rnk = 2
  and prevscan.errorid = lastscan.errorid
);