1

私は以下のように2つのデータセットを持っています

id name status 
1  A    a
2  B    b
3  C    c

別のデータセット

name status new
C    c      0
D    d      1
E    e      1
F    f      1

2番目のテーブルから1番目のテーブルにすべての行を挿入するにはどうすればよいですか?状況は、最初のテーブルが永続的であるということです。2番目のテーブルは毎月更新されるので、毎月更新されるテーブルのすべての行を永続テーブルに追加して、次のようにします。

id name status
1  A    a
2  B    b
3  C    c
4  D    d
5  E    e
6  F    f

私が直面している問題は、データセット1からIDをインクリメントできないことです。検索した限り、SASのデータセットには自動インクリメントプロパティがありません。自動インクリメントはデータステップを使用して実行できますが、このような2つのテーブルの場合にデータステップを使用できるかどうかはわかりません。通常のSQLは

Insert into table1 (name, status) 
select name, status from table2 where new = 1;

しかし、sasデータセットは自動インクリメント列をサポートしていないため、私が直面している問題があります。上記のprocsqlの後に以下のSASデータステップを使用して解決できます

data table1;
set table1;
if _n_ > 3 then id = _n_;
run;

これによりid列の値が増加しますが、コードはやや醜く、idは主キーであり、他のテーブルで外部キーとして使用されているため、古い行のIDを台無しにしたくありません。 。

私はSASの学習と作業の両方の過程にあるので、助けていただければ幸いです。前もって感謝します。

追加の質問:2番目のテーブルに新しい列がない場合、データステップを使用して必要なもの(月次テーブル(2番目)から永続テーブル(1番目)に新しい行を追加)を完了する方法はありますか?現在、この醜いproc sql/dataステップを使用して新しい列を作成しています

proc sql; //create a temp table from table2
create t2temp as select t2.*, 
(case when t2.name = t1.name and t2.status = t1.status then 0 else 1) as new
from table2 as t2 
left join table1 as t1
on t2.name = t1.name and t2.status = t1.status;
drop table t2; //drop the old table2 with no column "new"
quit;
data table2;  //rename the t2temp as table2
set t2temp;
run;
4

1 に答える 1

3

あなたはデータステップでそれを行うことができます。ところで、あなたがそれを完全に新しく作成しているなら、あなたはただ使うことができます

id+1;

自動番号付けされたフィールドを作成します(データステップがそれほど複雑ではないと仮定します)。これにより、現在の最大ID番号が追跡され、新しいデータセットにある場合は、各行に1つ上の番号が割り当てられます。

data have;
input id name $ status $;
datalines;
2  A    a
3  B    b
1  C    c
;;;;
run;

data addon;
input name $ status $ new;
datalines;
C    c      0
D    d      1
E    e      1
F    f      1
;;;;
run;

data want;
retain _maxID;                    *keep the value of _maxID from one row to the next, 
                                   do not reset it;
set have(in=old) addon(in=add);   *in= creates a temporary variable indicating which 
                                   dataset a row came from;
if (old) or (add and new);        *in SAS like in c/etc., 0/missing(null) is 
                                   false negative/positive numbers are true;
if add then ID = _maxID+1;        *assigns ID to the new records;
_maxID = max(id,_maxID);          *determines the new maximum ID - 
                                   this structure guarantees it works 
                                   even if the old DS is not sorted;
put id= name=;
drop _maxID;
run;

2番目の質問への回答:

はい、あなたはまだそれを行うことができます。最も簡単な方法の1つは、データセットをNAMEでソートしている場合です。

data want;
retain _maxID;
set have(in=old) addon(in=add);
by name;
if (old) or (add and first.name);
if add then ID = _maxID+1;
_maxID = max(id,_maxID);
put id= name=;
run;

first.nameは、同じ値のname;を持つ最初のレコードに対してtrueになります。したがって、HAVEにその名前の値がある場合、ADDONは新しいレコードを追加することを許可されません。

これはnameHAVEで一意である必要があります。そうでない場合、一部のレコードを削除する可能性があります。それが当てはまらない場合は、より複雑な解決策があります。

于 2013-03-21T14:34:00.750 に答える