我有一个包含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,但这是一般的想法。
答案 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。