SQL中的条件行删除

时间:2016-04-21 20:53:56

标签: sql sql-server-2012 conditional sql-delete delete-row

我有一个包含4列的表。我需要根据Code和ID列删除一些行。代码1启动我尝试跟踪的过程,并且代码2终止它。我想删除特定ID的所有行,当代码为2时,代码为1并且没有其他代码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
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,但这是一般的想法。

3 个答案:

答案 0 :(得分: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)
                  );

答案 1 :(得分: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 ...因此,将其删除。

我刚刚在逻辑中展示了这种方法......如果您需要有关删除代码的帮助,请告诉我。

答案 2 :(得分: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(日期),id代码= 1作为A              将获取具有代码1的特定id的最高日期的数据 选择代码,id,max(日期),id,其中code = 2 group by id)为B. 将获取具有代码2的特定ID的最高日期的数据

从B中选择id,其中A.id = B.id和B.date&gt; A.date将选择代码2日期高于代码1日期的所有ID。