SQLで削除や更新されたオブザベーション数を取得する。&SQLOBSは守備範囲が広い

以前「SASデータセットのオブザベーション数をマクロ変数に格納する方法」についてcall symputxやSQLのselect into:を紹介したのですが、もしデータセットがSQLのcreate table文で作成されたものであれば、自動マクロ変数の「&SQLOBS」が有効ではないかとコメントをいただきました。

コメント有難うございます!!
(コメントやご意見・ご感想、こういうところを取り上げてほしいとか
こういう処理はどうやっているかなどの相談でもいいので、いつでも募集しています)

その通りだと思います。

data A;
do X=1 to 10;
 output;
end;
run;

今10オブザベーションのデータセット「A」があり
以下のコードでA1を作成した後、&SQLOBSを展開すると
その中には、A1のオブザベーション数が入っています。
特別なコード書いてないのに、勝手に入ってます。
なんと素敵な。

proc sql;
 create table A1 as
  select X
  from A
  where X>3;
quit;

%put &SQLOBS;

それで、ついでに人の褌で今回のネタにさせていただいちゃうのですが
&SQLOBSのいいのは、こいつの性質が「SQLで最後に処理された行数が格納される」という
ちょっと曖昧な感じなところです。

処理されたということは、要は削除したり、更新したりしたすることも含まれるのですね。

ごくごくたまに、何オブザベーションが削除されたのか、また何オブザベーションが条件に合致して更新されたかなどを取得したい時が、ありますが、それがタダで手に入るのであればそんな素晴らしい話はないですよね。

要するに

proc sql;
 delete from A
 where X<5;
quit;

%put &SQLOBS;

なら、4となり。

data B;
do X=1 to 10;
 output;
end;
run;

proc sql;
update B
 set X=X*1.5
 where X<3;
quit;

%put &SQLOBS;

なら、2となるのです。

SQLとSASの機能の合わせ技は、どうしてもこうも心をくすぐるのでしょうか?

放言するならば、
SQLを知らないとSASのデータステッププログラミングの面白さの4割くらい損してるんじゃないかと僕は思います。




2 件のコメント:

  1. こんにちは。
    proc sql noprint;とすれば、obsの有無を0か1で返してくれたりってのもありますね。
    sqlobsひとつとっても奥が深いですねー。

    わたしもsql結構好きなので、知らないと面白さ4割減てのに賛同です。
    2007年位のユーザー会でSQLの簡単な紹介をしている発表がありましたが、
    会場の反応では「はじめて知った」という人もいましたし、賞をとっていました。
    今は以前より普及してると思いますが、もっとみんな使ってほしいですね。

    返信削除
  2. ですよね~。つい最近まで、SASの書籍が理論ベースのものに限られていて、そういう書籍の中だとデータステップの解説に割かれている部分って凄く少なくて、すぐunivariateとかttestとかにいっちゃうんでSQLなんて登場すらしないんですよね。今でこそ、データステップのテクニックにページを割く本もでてきて、SQLも便利なテクニックとして紹介されるようになりましたが。さらなる普及を望みます。
    ぜひ、来年のSASユーザー総会でSQLのより複雑な利用法とか書いていただけませんか??お手伝いできるとことがあれば私も微力ながら手伝わせていただきますので、、

    返信削除