2017-10-08 3 views
0

MSSQLデータベースのテーブルの値を比較する際に問題が1つあります。テーブル内の2つの連続した行を比較し、条件が満たされた場合に結果を無視する

1つの列(IDと呼ぶ)には整数値が含まれています。これらの値は連続しているはずです。他の列には位置ID情報が含まれています。ここでは、製品が品質検査に失敗したかどうか(バイナリ値 - 0または1)の情報を含むも​​う1つの列があります。

今私がしようとしているのは、2つの連続した行を比較し、ID列の値が連続しているかどうかを調べ、ID列に連続する値を持たないこれらの位置IDをIF品質チェック列値が0の場合は、次の行にジャンプして次の行と前の行を比較するクエリを1にします。

ので、それを要約すると、私は0で品質チェックのセットのための連続したID値を持っていないテーブルからのみlocationIDsを選択します(その1、ない連続した場合 - 結果を無視する)

私がいましたこれをカーソルを使って考えることは考えていますが、私は確信していませんが、誰かが正しい方向に向けることができれば非常に感謝しています。ありがとう!

+3

あなたの質問を編集し、サンプルデータと希望する結果を提供してください。 'locationId'と' id'とは何が関係していますか? –

+0

適切なソフトウェア(MySQL、Oracle、DB2など)とバージョンの両方でデータベースの質問にタグを付けると便利です。 'sql-server-2014'です。構文と機能の相違は、回答にしばしば影響します。 'リード'/'ラグ'。 'tsql'は選択肢を絞り込みますが、データベースは指定しないことに注意してください。 – HABO

答えて

1

これはlag()を使用して行うことができます。私はそれがこのようなものだと思う:

select t.* 
from (select t.*, 
      lag(id) over (order by id) as prev_id, 
      lag(info) over (order by id) as prev_info 
     from t 
    ) t 
where id <> prev_id + 1 and prev_info = 0 and info = 0; 

これは、ギャップの後の行を返します。

0
select t.* 
from (select t.*, 
      lag(id) over (order by id) as prev_id 
     from t 
     where info = 0 
    ) t 
where id > prev_id + 1 
order by id 
関連する問題