我有兩個表,它們都有一個ID列。我想選擇一個表中具有第二個表中的ID的行。SAS:選擇ID在另一個表中的行
我R我會這麼說tbl1 [tbl $ ID%in%tbl2 $ ID,],但我還沒有找到一種方法將其轉換爲SAS。
我有兩個表,它們都有一個ID列。我想選擇一個表中具有第二個表中的ID的行。SAS:選擇ID在另一個表中的行
我R我會這麼說tbl1 [tbl $ ID%in%tbl2 $ ID,],但我還沒有找到一種方法將其轉換爲SAS。
試試這個:
PROC SQL;
CREATE TABLE result AS
SELECT t2.*
FROM table1 AS t1, table2 AS t2
WHERE t1.id = t2.id
;
QUIT;
data out;
merge table1 (in=t1) table2 (in=t2);
by id;
if t1 and not t2;
run;
這隻有在兩個數據集都是'id'順序(或者有合適的索引)並且與OP想要的相反時纔會起作用......它排除了一組* *在另一箇中...... OP還聲明他們需要來自一個數據集的行,他們可能不希望從合併中覆蓋其他列或值。 –
這是香港大井的方法與喬恩克萊門特提出更正的擴展。我發現使用數據步驟比使用SQL更快。它爲您提供更多的數據輸出選項。例如,此解決方案創建一個名爲「match_error」的表,該表包含table1中不在table2中的所有ID。
proc sort data=table1;
by id;
run;
proc sort data=table2;
by id;
run;
data result match_error;
merge table1 (in=in_T1) table2 (in=in_T2 keep=id);
by id;
if in_T1 and in_T2 then output result;
if in_T1 and not in_T2 then output match_error;
run;
我只會注意到避免連接可能更高效,因爲它僅用於此處的成員測試的副作用,而不是其主要任務。 'select * from t2 where id in(select select from t1)'應該允許優化器更有效地計劃查詢,並且對於查詢的意圖更加清楚(imho)。 –