2017-04-18 14 views
0

内の他の2つの値の間の1列目の3つの以上の値を持つすべてのレコードを検索:は、私はテーブルを持っ例えば、その列

COL_0 COL_1 COL_2 
11111 BBBB RECORD DELETED 
11111 BBBB RECORD ADDED 
11111 AA  lalala 
11111 BBBB RECORD ADDED 
11111 AA  lalala 
11111 CCCCCC RECORD ADDED 
11111 AA  lalala 
11111 BBBB RECORD ADDED 
11111 AA  lalala 
11111 BBBB RECORD ADDED 
11111 CCCCCC RECORD ADDED 
11111 AA  lalala 
11111 BBBB RECORD DELETED 
11111 AA  lalala 
11111 BBBB RECORD ADDED 
11111 BBBB RECORD ADDED 
11111 AA  lalala 
11111 CCCCCC RECORD ADDED 
11111 AA  lalala 
11111 BBBB RECORD DELETED 
11111 AA  lalala 
11111 BBBB RECORD ADDED 
11111 AA  lalala 
11111 BBBB RECORD ADDED 
11111 CCCCCC RECORD ADDED 
11111 AA  lalala 
11111 BBBB RECORD DELETED 

COL_0はIDで、実際のテーブルに多くの異なるIDがあります。 COL_1は別のテーブルへのリンクです。 COL_2は他のテーブルで操作されています。

これは変更できません。問題は、アプリケーションが正しく動作せず、状況によってはレコードを削除することです。今私は、2つの "RECORD DELETED"の間に3 "RECORD ADDED"以上のすべてのIDを見つける必要があります。それには何らかの方法がありますか?

Brで、

+0

SQLテーブルが*順不同*セットを表します。行の順序を指定する列が必要です。 –

+0

さらに詳しく説明するために、各操作にタイムリレイテッド情報のタイムスタンプがありませんか?それがなければ何もすることはできません – rpd

+0

作成され、変更された時間があります。私は6ヶ月前にすべてを見つける必要がありますが、私はより正確にはわかりません。 – MikeL

答えて

0

はい、あなたは、分析機能を使用することによってこれを行うことができます - あなたが順序を指定する列を持っていると仮定。この情報を持つdteの列があると仮定します。

レコードの削除されたレコードの累計を使用して、グループを識別することから始めます。次に、各グループの追加されたレコードを数えます:

select id, min(dte), max(dte) 
from (select t.*, 
      sum(case when col_2 = 'RECORD DELETED' then 1 else 0 end) over (partition by col_1 order by dte) as grp 
     from t 
    ) t 
where col_2 = 'RECORD ADDED' 
group by id, grp 
having count(*) >= 3; 

注:これは、発生するすべての発生を示しています。あなたは本当にただidをしたい場合は、group byselect distinctを使用することができます - まれの1本ががちソリューションであるとき:

select distinct id 
from (select t.*, 
      sum(case when col_2 = 'RECORD DELETED' then 1 else 0 end) over (partition by col_1 order by dte) as grp 
     from t 
    ) t 
where col_2 = 'RECORD ADDED' 
group by id, grp 
having count(*) >= 3; 
+0

はい、注文を指定する列があります。ありがとう、私はこれで何かを試し、報告して戻します。 – MikeL

+0

私は何かを逃しています...私は使用しています... from(select t。*、 gr_from table_nameから(col_2 = 'RECORD DELETED'、次に1 else 0 end)over(パーティションby col_1 order by dte) t )それはテーブルからすべてのidを返します。 – MikeL

+0

@MikeL。 。 。それがサブクエリです。外部クエリは、 'RECORD ADDED'を持つ行だけを返します。完全なクエリを実行しましたか? –

関連する問題