same演算子でwhere式の置き換えではなくwhereの追加を行う

前の投稿でwhere特有のcontainsやbetween等を紹介しましたが、今回はsameです。
一緒にするには少し毛色が違ったのでわけました。

さて今、以下のようなデータセットがあったとします。

data Q1;
do X=1 to 5;
 output;
end;
run;









そこに

data A1;
 set Q1;
 where X>2;
 where X<4;
run;

を実行すると、何がおきると思いますか?
whereステートメントが連続で、でてきます。

え、エラーじゃないの?と思われた方は不正解で、正しく実行されます。

結果は







となり、ログをみると













WHERE式を置き換えました」というNOTEがでています。
つまり、一つ目のWHEREは二つ目に上書きされて、無効化されてしまったのです。
最後にくるWHEREだけが効きます。

もし、今やりたいことが「X>2」「 X<4」の2条件で抽出をかけることであれば

当然

data A1;
 set Q1;
 where X>2 and X<4;
run;

でいいわけです。

が、しかし、次のようにも書くことができます。
それが

data A2;
 set Q1;
 where X>2;
 where same X<4;
run;


















ですsameをつなぐことによって
whereステートメント同士をandでつなぐのと同じ効果があります。
WHERE式を追加しました」というNOTEがでます。

で、どういう時に使うかというと

抽出式があまりに長くなって見通しが悪い時や、
元コードをできるだけ修正せずに、新しい条件を追加したい場合、
マクロ化して、抽出条件をオプションで追加できるように組む場合等でしょうか?

条件を色々追加しながら対話的に、データを段階的に絞りこんで探索する場合なんかも
いちいち and ○○とかいていくより、区切りがつくのでお勧めです。
















3 件のコメント:

  1. こんにちは。
    「where also」しか知らなかったんですが、「same」なんてのもあったんですね。
    SASv9.2では5個以上「where also」文を書くと、エラーが出たり、正しい結果が得られなかったりするらしいですが、「same」だと大丈夫なんでしょうか?
    9.3の環境しかないので試せないのですが。。

    返信削除
  2. こんにちわ。
    僕は「where also」知りませんでした!5個以上の問題も初耳でした!
    今、9.2の環境で5個以上書いてみたら、alsoもsameも正しく結果でましたが、
    抽出条件によるのでしょうか。
    ググってみたら確かに
    「Problem Note 41119: Multiple WHERE ALSO statements in the DATA Step returns incorrect results or errors」としてHotfixでてました。

    http://support.sas.com/kb/41/119.html

    でもsameのこと書いてないし

    他の場合、例えばsetステートメントの1個ずつメモリを解放するつなぎ方でalsoとsame使えませんってときの説明にはsameとalsoを併記しているので
    [WHERE ALSO and WHERE SAME AND statements do not work with OPEN=DEFER option on SET statement]
    http://support.sas.com/kb/37/657.html

    5個以上の問題はALSOだけなのかもしれません、、。

    返信削除
  3. あ、リンク見たら5個じゃなくて6個以上の間違えでした。
    とりあえず現状はエラー報告のあがってないsameがいいっぽいですね。
    ありがとうございました!

    返信削除