我希望找到上次扫描时没有出现错误的最新扫描。
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作为我的数据库。
答案 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
);