2017-06-07 9 views
0

私は、前回のスキャンでエラーが発生していない最新のスキャンIDを探しています。上記例えば以前の列には存在しない値を見つけよう

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 

、Iは、結果として行の下に表示する:

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

したがって、errorIDの2はSCANID 2で繰り返されていない、また、私はこの行の状態を変更する必要があります最新のスキャンの一部ではないerrorid 2については、10。

私はNOT INとEXISTSを使用しようとしましたが、期待される記録は得られませんでした。

私はデータベースとしてPostgreSQLを使用しています。

+0

したがって、すべてのscanidを以前のものと比較してチェックする必要があります。欠落しているerroridが結果になるはずです。正しいですか? –

+0

それは私が欲しいものです。 – hadooper

+1

@hadooper。 。 。理解できません。データに指定した行のような行はありません。 「前のスキャン」とは何ですか? 1、2、3、4、5の複数のエラーがあるとどうなりますか? –

答えて

0

最高と2番目に高いスキャン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 
); 
関連する問題