2017-04-22 66 views
0

我遇到问题。我有SQL表有两个变量,但重复交替。 因此,如果我们有一个表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 

或者,

A_ID OTHER_ID FINAL_ID 
1111 2222  2222  
2222 1111  2222   
0000 0101  0101   
3333 5555  3333  
5555 3333  5555 

感谢。

+0

你尝试过这么远吗? –

+0

其实我需要做到这一点是sas,提出这只是为了看看你如何工作这是SQL。 – ammosperros

+0

如果你的数据源有一个类似'(1111,5678)'的记录呢? – toonice

回答

1
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; 

表temp创建一个关键变量,它是A_ID和OTHER_ID的八位串联,一旦它们被数字排序。然后通过查看这个关键变量可以找到不同的组合。

表温度看起来是这样的:

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 
+0

好逻辑。大。但是,如果它们是字符值而不是数字,我们该如何处理? –

+0

完美!很乐意在未来获得您的帮助。 :) – ammosperros

+0

G.arina好抓! – ammosperros

0

对于第一输出: -

/***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; 

希望这有助于:-)

+0

帮我理解查询的这一部分。当内部表中不存在col_lag时,如何将它用作外部查询的where条件。 “从 ( 从具有 SELECT DISTINCT A_ID,OTHER_ID )创建表答案作为选择 A_ID,OTHER_ID一个 其中col_lag未= A_ID或col_lag未='“; 退出;” –

+0

@ G.arima谢谢你指出。由于一些奇怪的原因在复制粘贴时错过了它。现在修复它 –