我实际上是在尝试加入两个变量ID
和ACCOUNTNUMBER
。简单。但是,FULL
数据集有一行共同的ID
但不同的ACCOUNTNUMBER
(请注意重命名)和CAR
。我想合并这些并让ID
保留这些值。请参阅以下示例数据:
DATA FULL;
LENGTH ID ACCT_FULL CAR $12.;
INPUT ID $ ACCT_FULL $ CAR $;
DATALINES;
A 123 MAZDA
B 456 FORD
C 789 CHEVY
D 777 NISSAN
;
RUN;
DATA SUBSET;
LENGTH ID ACCOUNTNUMBER $12.;
INPUT ID $ ACCOUNTNUMBER $;
DATALINES;
A 123
B 456
C 789
D 012
;
RUN;
** THIS QUERY DOES NOT QUITE OUTPUT A DATASET I WANT **;
PROC SQL NOPRINT;
CREATE TABLE WANT_BAD AS
SELECT *
FROM SUBSET AS A
LEFT JOIN
FULL(RENAME=(ACCT_FULL=ACCOUNTNUMBER)) AS B
ON A.ID = B.ID AND
A.ACCOUNTNUMBER = B.ACCOUNTNUMBER;
QUIT;
以下是我目前所拥有的与我想要的内容的并列比较:
Bad Output: Want Output:
A 123 MAZDA | A 123 MAZDA
B 456 FORD | B 456 FORD
C 789 CHEVY | C 789 CHEVY
D 012 | D 012 NISSAN
| D 777 NISSAN
我的问题是 - 我可以在查询中添加某种UNION
语句来输出我想要的数据吗?我想在SQL而不是数据步骤中执行此操作,因为现实生活中的FULL
数据量很大,我不想使用IN=
语句读入,排序和合并,因为它会需要更长时间。
答案 0 :(得分:0)
这很奇怪,因为即使在没有匹配帐号的行上也要查找car
。
因此,一种方法是union
对所有id
/ accountnumber
对一起获取所有行。然后将car
信息带回来:
proc sql:
select fs.id, fs.accountnumber, f.car
from ((select f.id, f.accountnumber from full f) union
(select s.id, s.acct_full from subset s)
) fs left join
full f
on f.id = fs.id;
答案 1 :(得分:0)
我想出了一些SQL代码,它与您提供的玩具数据一起使用,似乎可以提供您想要的结果。这将执行两个INNER JOINS - 第一个使用来自" FULL"的ID。第二次加入使用来自" SUBSET"的ID。 - 在两个INNER JOINS之间有一个UNION。我不认为这段代码是有效的,但我无法想到任何其他方法来实现这一点。使用您的数据样本进行测试,看它是否按照您想要的方式工作。
PROC SQL NOPRINT;
/* THIS INNER JOIN MATCHES BY ID ONLY */
/* CREATES NEWACCT USING ACCOUNT NUMBER FROM "FULL" */
CREATE TABLE TRY_AGAIN AS
SELECT A.*, B.*,
B.ACCT_FULL AS NEWACCT
FROM SUBSET AS A
INNER JOIN
FULL AS B
ON A.ID = B.ID
UNION
/* THIS INNER JOIN MATCHES BY ID AND AND ACCOUNT NUMBER */
/* KEEPS ONLY IF ACCOUNT NUMBERS DO NOT MATCH */
/* CREATES NEWACCT USING THE ACCOUNT NUMBER FROM "SUBSET" */
SELECT A.*, B.*,
A.ACCOUNTNUMBER AS NEWACCT
FROM SUBSET AS A
INNER JOIN
FULL AS B
ON A.ID = B.ID AND
A.ACCOUNTNUMBER NOT= B.ACCT_FULL
ORDER BY ID, NEWACCT
;
QUIT;