根据不同列中的值删除重复项
Remove duplicates based on a value from a different column
在 MS Visual Studio 中,我有以下 table 1,我想在其中删除基于 PrimIndicator 列的重复 caseNum。如果案例编号有重复的 caseNum,我想保留带有“True”PrimIndicator 的行,如果 caseNum 不重复,则保留 CaseNum。
表 1:
ID CaseNum PrimIndicator
1 AAA-123 TRUE
2 AAA-123 FALSE
3 BBB-546
4 CCC-753 TRUE
5 CCC-753
6 ABC-347
7 DEF-546 TRUE
8 DEF-346
想要表 2:
ID CaseNum PrimIndicator
1 AAA-123 TRUE
3 BBB-546
4 CCC-753 TRUE
6 ABC-347
7 DEF-546 TRUE
到目前为止我已经试过了,但如果 PrimIndicator 为空,max() 函数似乎不起作用。
Select ID, distinct CaseNum, Max(PrimIndicator)
from Table1
group by CaseNum, PrimIndicator
您可以使用 window 函数:
select *
from (select t.*, count(*) over(partition by casenum) cnt from table1 t) t
where t.primindicator = 'true' or cnt = 1
如果每个 casenum
只需要一行,我建议 row_number()
:
select t.*
from (select t.*,
row_number() over (partition by casenum
order by case when primeindicator = 'true' then 1 else 2 end
) as seqnum
from t
) t
where seqnum = 1;
这 保证 结果集中每个 casenum
一行。
根据您的数据,您还可以使用 where
逻辑:
select t.*
from t
where t.primeindicator = 'true' or
not exists (select 1
from t t2
where t2.casenum = t.casenum and
t2.primeindicator = 'true'
);
这不能保证每个 casenum
一行 - 但它确实适用于您提供的数据。
在 MS Visual Studio 中,我有以下 table 1,我想在其中删除基于 PrimIndicator 列的重复 caseNum。如果案例编号有重复的 caseNum,我想保留带有“True”PrimIndicator 的行,如果 caseNum 不重复,则保留 CaseNum。
表 1:
ID CaseNum PrimIndicator
1 AAA-123 TRUE
2 AAA-123 FALSE
3 BBB-546
4 CCC-753 TRUE
5 CCC-753
6 ABC-347
7 DEF-546 TRUE
8 DEF-346
想要表 2:
ID CaseNum PrimIndicator
1 AAA-123 TRUE
3 BBB-546
4 CCC-753 TRUE
6 ABC-347
7 DEF-546 TRUE
到目前为止我已经试过了,但如果 PrimIndicator 为空,max() 函数似乎不起作用。
Select ID, distinct CaseNum, Max(PrimIndicator)
from Table1
group by CaseNum, PrimIndicator
您可以使用 window 函数:
select *
from (select t.*, count(*) over(partition by casenum) cnt from table1 t) t
where t.primindicator = 'true' or cnt = 1
如果每个 casenum
只需要一行,我建议 row_number()
:
select t.*
from (select t.*,
row_number() over (partition by casenum
order by case when primeindicator = 'true' then 1 else 2 end
) as seqnum
from t
) t
where seqnum = 1;
这 保证 结果集中每个 casenum
一行。
根据您的数据,您还可以使用 where
逻辑:
select t.*
from t
where t.primeindicator = 'true' or
not exists (select 1
from t t2
where t2.casenum = t.casenum and
t2.primeindicator = 'true'
);
这不能保证每个 casenum
一行 - 但它确实适用于您提供的数据。