当重复项不在同一列中时删除重复项

时间:2012-12-07 20:33:37

标签: sql excel duplicates sas

以下是我的数据样本(n> 3000),它将两个数字联系在一起:

id  a       b
1   7028344 7181310
2   7030342 7030344
3   7030354 7030353
4   7030343 7030345
5   7030344 7030342
6   7030364 7008059
7   7030659 7066051
8   7030345 7030343
9   7031815 7045692
10  7032644 7102337

现在,问题是id = 2是id = 5的副本,id = 4是id = 8的副本。因此,当我尝试编写if-then语句以将列a映射到列b时,基本上数字才会被交换。在我的完整数据中有很多这样的情况。

所以,我的问题是识别副本并以某种方式删除其中一个重复项(id = 2或id = 5)。我最好想在Excel中执行此操作,但我也可以使用SQL Server或SAS。

提前谢谢你。如果我的问题不明确,请发表评论。

我想要的是什么:

id  a       b
1   7028344 7181310
2   7030342 7030344
3   7030354 7030353
4   7030343 7030345
6   7030364 7008059
7   7030659 7066051
9   7031815 7045692
10  7032644 7102337

2 个答案:

答案 0 :(得分:2)

各种各样的方法。

在SAS或SQL中,这很简单(对于SQL Server,SQL部分应该相同或几乎相同):

data have;
input id a b;
datalines;
1   7028344 7181310
2   7030342 7030344
3   7030354 7030353
4   7030343 7030345
5   7030344 7030342
6   7030364 7008059
7   7030659 7066051
8   7030345 7030343
9   7031815 7045692
10  7032644 7102337
;;;;
run;

proc sql undopolicy=none;
delete from have H where exists (
  select 1 from have V where V.id < H.id
    and (V.a=H.a and V.b=H.b) or (V.a=H.b and V.b=H.a)
);
quit;

excel解决方案需要创建一个额外的列,我相信两个字符串的串联,按顺序(任何顺序都可以),然后查找是否是具有该值的第一行。我不认为你可以不创建额外的列(或使用VBA,如果你可以使用它也会有一个相当简单的解决方案)。

编辑: 实际上,excel解决方案可以在不创建新列的情况下实现(嗯,您需要将此公式放在某个位置,但不需要另外的列)。

=IF(OR(AND(COUNTIF(B$1:B1,B2),COUNTIF(C$1:C1,C2)),AND(COUNTIF(B$1:B1,C2),COUNTIF(C$1:C1,B2))),"DUPLICATE","")

假设ID在A中,B和C包含值(并且没有标题行)。该公式进入第二行(即B2 / C2值),然后延伸到更多行(因此第36行将使数组为B1:B35和C1:C35等)。这将DUPLICATE置于上面某些重复的行中,并且在唯一的行中为空。

答案 1 :(得分:0)

我没有对此进行过测试,但这里有一些值得思考的东西,你可以加入桌子对抗自己并获得具有重复的ID

 SELECT
     id, a, b
 FROM
    [myTable]
    INNER JOIN ( SELECT id, a, b FROM [myTable] ) tbl2
        ON [myTable].a = [tbl2].b
           OR [myTable].b = tbl2.a