SQL:用重复的值标记多个记录,但在备用列中

SQL:用重复的值标记多个记录,但在备用列中,sql,sql-server-2008,sas,Sql,Sql Server 2008,Sas,我有个问题。我有一个SQL表,它有两个变量,但交替复制。 如果我们有一张桌子 A_ID OTHER_ID 1111 2222 2222 1111 0000 0101 3333 5555 5555 3333 我想要一张独特的桌子 A_ID OTHER_ID 1111 2222 0000 0101 3333 5555 或者 谢谢。第一次输出:- dat

我有个问题。我有一个SQL表,它有两个变量,但交替复制。 如果我们有一张桌子

A_ID   OTHER_ID   
1111      2222   
2222      1111    
0000      0101  
3333      5555   
5555      3333
我想要一张独特的桌子

A_ID   OTHER_ID       
1111    2222          
0000    0101   
3333    5555
或者

谢谢。

第一次输出:-

data dat;
    input A_ID $ OTHER_ID $;
    datalines;                      
1111      2222   
2222      1111    
0000      0101  
3333      5555   
5555      3333
;

proc sql;
    create table temp as
    select A_ID, OTHER_ID, 
    case 
        when (A_ID<OTHER_ID) then cat(A_ID,OTHER_ID)
        when (OTHER_ID<A_ID) then cat(OTHER_ID,A_ID)
        end as key
    from dat
    order by A_ID;
quit;

data final;
    retain A_ID OTHER_ID;
    set temp;
    by key;
    if first.key;
run;
/***In SQL server***/    
CREATE TABLE TABLES2(A_ID varchar(20), OTHER_ID varchar(20));

INSERT INTO TABLES2 VALUES('1111','2222');
INSERT INTO TABLES2 VALUES('2222','1111');
INSERT INTO TABLES2 VALUES('0000','0101');
INSERT INTO TABLES2 VALUES('3333','5555');
INSERT INTO TABLES2 VALUES('5555','3333');


select A_ID ,OTHER_ID 
from
(
Select distinct A_ID ,OTHER_ID,(lag(OTHER_ID) over (order by A_ID)) as col_lag
from tables2
) a
where A_ID <> col_lag or col_lag is null


 /****OUTPUT****/
A_ID    OTHER_ID
0000    0101
1111    2222
3333    5555

select A_ID ,OTHER_ID 
from
(
Select distinct A_ID ,OTHER_ID,(lag(OTHER_ID) over (order by A_ID)) as col_lag
from tables2
) a
where A_ID <> col_lag or col_lag is null    


/***In SAS with same logic using lag function***/

data have;
    input A_ID  OTHER_ID ;
    datalines;                   
1111      2222   
2222      1111  
0000      0101 
3333      5555  
5555      3333  
;

data have;
set have;
col_lag =lag(OTHER_ID);
run;

/* if character columns*/
proc sql;
create table answer as
select A_ID ,OTHER_ID from
(
Select distinct A_ID ,OTHER_ID,col_lag
from have
) a
where col_lag not= A_ID or col_lag not= ' ';
quit;

/* if numeric columns*/
proc sql;
create table answer as
select A_ID ,OTHER_ID from
(
Select distinct A_ID ,OTHER_ID,col_lag
from have
) a
where col_lag not= A_ID or col_lag not=.;
quit;

希望这有帮助:-

实际上我需要做的是sas,提出这一点只是为了看看如何计算sql。如果您的数据源有11115678这样的记录呢?逻辑不错。伟大的但是如果它们是字符值而不是数字值,我们如何处理呢?太好了!希望将来能得到你的帮助实际上,我让代码用于字符值,因为示例中的数字有许多前导零。尝试将一些值更改为字符-它仍然可以工作。您不认为使用_IDIt仍然可以对它们进行排序,尽管这次是按字母顺序排列的。请帮助我理解查询的这一部分。当COLU lag在内部表中不存在时,如何将其用作外部查询的where条件。创建表格答案为select A_ID,OTHER_ID from select distinct A_ID,OTHER_ID from have A where col_lag not=A_ID或col_lag not=“”;退出@arima谢谢你指出这一点。由于一些奇怪的原因,在复制粘贴时错过了它。现在修好了
Obs A_ID OTHER_ID key 
1 0000 0101 0000 0101 
2 1111 2222 1111 2222 
3 2222 1111 1111 2222 
4 3333 5555 3333 5555 
5 5555 3333 3333 5555 
/***In SQL server***/    
CREATE TABLE TABLES2(A_ID varchar(20), OTHER_ID varchar(20));

INSERT INTO TABLES2 VALUES('1111','2222');
INSERT INTO TABLES2 VALUES('2222','1111');
INSERT INTO TABLES2 VALUES('0000','0101');
INSERT INTO TABLES2 VALUES('3333','5555');
INSERT INTO TABLES2 VALUES('5555','3333');


select A_ID ,OTHER_ID 
from
(
Select distinct A_ID ,OTHER_ID,(lag(OTHER_ID) over (order by A_ID)) as col_lag
from tables2
) a
where A_ID <> col_lag or col_lag is null


 /****OUTPUT****/
A_ID    OTHER_ID
0000    0101
1111    2222
3333    5555

select A_ID ,OTHER_ID 
from
(
Select distinct A_ID ,OTHER_ID,(lag(OTHER_ID) over (order by A_ID)) as col_lag
from tables2
) a
where A_ID <> col_lag or col_lag is null    


/***In SAS with same logic using lag function***/

data have;
    input A_ID  OTHER_ID ;
    datalines;                   
1111      2222   
2222      1111  
0000      0101 
3333      5555  
5555      3333  
;

data have;
set have;
col_lag =lag(OTHER_ID);
run;

/* if character columns*/
proc sql;
create table answer as
select A_ID ,OTHER_ID from
(
Select distinct A_ID ,OTHER_ID,col_lag
from have
) a
where col_lag not= A_ID or col_lag not= ' ';
quit;

/* if numeric columns*/
proc sql;
create table answer as
select A_ID ,OTHER_ID from
(
Select distinct A_ID ,OTHER_ID,col_lag
from have
) a
where col_lag not= A_ID or col_lag not=.;
quit;