2016-04-21 72 views
0

我有一個包含4列的表。我需要刪除一些基於代碼和ID列的行。代碼1啓動我試圖跟蹤的進程,代碼2終止它。我想刪除特定ID的所有行時的2碼自帶的1碼後,並沒有額外的代碼。例如,我目前的數據集是這樣的: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 

後我跑我的劇本我想它看起來就像這樣:

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 

在所有我有大約150,000的ID在我實際的表,但這是一般的想法。

+0

而你的數據庫引擎是什麼? –

+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嗎?它只有2個記錄,代碼爲1,代碼爲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,最大(日期),id其中代碼= 1作爲一個 將用於代碼1 選擇代碼,ID,最大(日期的特定ID提取具有最高的日期數據),id其中code = 2 group by id)作爲B 將獲取具有最高日期的數據用於特定代碼ID 2

從B選擇ID其中A.id = B.id和B.date> A .date將選擇代碼2日期高於代碼1日期的所有ID。