2016-04-21 28 views
0

私は4つの列を含むテーブルを持っています。コード列とID列に基づいて行の一部を削除する必要があります。コード1は私が追跡しようとしているプロセスを開始し、コード2はそれを終了させます。 2のコードが1のコードの後に​​来ると、追加のコード1は、例えば、存在しないとき、私は特定のIDのすべての行を削除したいと思い、私の現在のデータセットは、次のようになります。条件付き行SQLでの削除

Code Deposit Date  ID 
1  $100  3/2/2016 5 
2  $0  3/1/2016 5 
1  $120  2/8/2016 5 
1  $120  3/22/2016 4 
2  $70  2/8/2016 3 
1  $120  1/3/2016 3 
2  $0  6/15/2015 2 
1  $120  3/22/2016 2 
1  $50  8/15/2015 1 
2  $200  8/1/2015 1 

後私は私のスクリプトを実行し、私はそれは次のようになりたい:私は私の実際のテーブルには約150,000 IDを持っていますが、これは一般的な考え方であるすべてで

Code Deposit Date  ID 
1  $100  3/2/2016 5 
2  $0  3/1/2016 5 
1  $120  2/8/2016 5 
1  $120  3/22/2016 4 
1  $50  8/15/2015 1 
2  $200  8/1/2015 1 

+0

そして、あなたのDBエンジンありますか? –

+0

SQL 2012を使用しています – mdarr

+0

コードの後に​​コードがいつ来るかをどのように判断しますか?そのような行為のためのあなたの注文コラムは日付のようには思われません。 ID = 2を削除するアクションを決定するのは何ですか? –

答えて

1

あなたはこのようにロジックを使用してIDを取得することができます:

select t.id 
from t 
group by t.id 
having max(case when code = 2 then date end) > min(case when code = 1 then date end) and -- code 2 after code 1 
     max(case when code = 2 then date end) > max(case when code = 1 then date end) -- no code 1 after code2 

その後、詳細の残りの部分を取得するには、クエリにこれを組み込むために十分に簡単です:

select t.* 
from t 
where t.id not in (select t.id 
        from t 
        group by t.id 
        having max(case when code = 2 then date end) > min(case when code = 1 then date end) and -- code 2 after code 1 
          max(case when code = 2 then date end) > max(case when code = 1 then date end) 
       ); 
0

私が取ったアプローチは、IDごとにコードを追加することでした。それが正確に3に等しい場合は、削除する必要があります。

;WITH keepID as (
Select 
    ID 
    ,SUM(code) as 'sumCode' 
From #testInit 
Group by ID 
HAVING SUM(code) <> 3 
) 

Select * 
From #testInit 
Where ID IN (Select ID from keepID) 

あなたの投稿はID = 1の保持を示していましたが、それは基準に合わないようですか? ID = 1のままにしてもよろしいですか?それは、1のコードと2のコードを2つのレコードにして3つまで追加するだけなので、削除します。

私はちょうどロジックのアプローチを示しました...あなたが削除コードの助けが必要かどうかを教えてください。

+0

ああ... #testInitはサンプル値で作成した一時テーブルです。 –

0
delete from table 
where table.id in 

(select id from B where A.id=B.id and B.date>A.date 
from 
(select code,id,max(date),id where code=1 group by id) as A, 
(select code ,id,max(date),id where code=2 group by id) as B) 

説明:選択コード、ID、MAX(日付)、 としてコード= 1は、コード1 選択コード、ID、MAX(日付の固有IDの最高日付でデータをフェッチするID )、idはcode = 2 group by id)のように、コード012の特定のIDの日付が最も高いデータを取得します。

select id from Bここで、Aid = B.idおよびB.date> A .dateは、コード2の日付がコード1の日付よりも高いすべてのIDを選択します。