1

現在、SAS で生データを処理し、次のようなクエリを実行するプログラムがあります。

/*this code joins the details onto the spine, selecting the details 
 that have the lowest value2 that is greater than value, or if there are none
 of those, then the highest value2*/
/*our raw data*/
data spine; 
    input id value; 
    datalines;
    1 5
    2 10
    3 6
;
run;

data details;
    input id value2 detail $; 
    datalines;
    1 6 foo
    1 8 bar
    1 4 foobar
    2 8 foofoo
    2 4 barbar
    3 6 barfoo
    3 2 foobarfoo
;
run;

/*cartesian join details onto spine, split into highs and lows*/    
proc sort data = spine;
by id; 
run; 

proc sort data= details;
    by id; 
run;

data lows highs;
    join spine details;
    by id;
    if value2 ge value then output highs;
    else output lows;
run;

/*grab just the first/last of each set*/
proc sort data =lows;
by id value2;
run;

proc sort data = highs;
by id value2; 
run;

data lows_lasts;
    set lows;
    by id;
    if last.id;
run;

data highs_firsts;
    set highs;
    by id;
    if first.id;
run;

/*join the high value where you can*/
data join_highs;
    merge spine(in = a)
    highs_firsts ;
    by id;
    if a;
run;

/*split into missing and not missng*/
data not_missing still_missing;
    set join_highs;
    if missing(value2) then output still_missing;
    else output not_missing; 
run;

/*if it doesn't already have a detail, then attach a low*/
data join_lows;
    merge still_missing(in = a)
    lows_lasts ;
    by id; 
    if a;
run;

/*append the record that had a high joined, and the record that had a low joined, together*/ 
data results;
    set not_missing join_lows;
run; 

あなたは絵を手に入れます。この種のデータ処理ステートメントは数多くあり、新しいレコードに対して毎週実行されます。

また、データ変換も行っています (アドレスのクレンジング/解析など)。

さて、この種の処理はSQL を使用して実行できます。

問題は、これはリレーショナル データベースの適切な使用法でしょうか? それとも、データベースはデータの保存と検索にのみ使用する必要がありますか?

最大 1,000 万行のテーブルについて話していると考えてください。

4

2 に答える 2

1

SASは、あなたが言及したような操作のために設計されています! これらの処理のほとんどは RDBMS で行うことができますが、典型的な RDBMS の分析機能は、SAS 関数に比べて制限されています。SASにも洗練された構造がいくつかあります。たとえば、SAS First and Last処理のSQL代替はより面倒です。コードは、毎週のフローとして簡単に整理およびスケジュールできます。

主な質問は、なぜ RDBMS を使用したいのか、どのような利点があるのか​​ということです。2 つの潜在的な利点が頭に浮かびました。

  • マルチユーザーの使用: RDBMS の組み込みのロックおよびトランザクション管理により、複数のデータベース ユーザーがデータベースに同時にアクセスできます。これはあなたの状況には当てはまらないと思います。
  • レコードのロード: 数十億のレコードの場合、SAS データセットのサイズが大きくなり、COMPRESS オプションがオンになっていても処理が困難になる可能性があります (速度も問題になる可能性があります)。このような場合、データを RDBMS に保存し、SAS/Access インターフェイスを介してアクセスすることをお勧めします。これはあなたの状況にも当てはまらないと思います。

SAS ソリューションの RDBMS を使用する場合は、コードの一部を書き直す必要があることに注意してください。libname メソッドを使用して実行すると、一部の SAS 関数が RDBMS で機能しないためです。FedSQL (SAS 9.4 で導入された ANSI SQL:1999 コア標準の SAS 実装) の使用は、この問題を解決しています。

また、特殊なケースでは、 SAS を使用する場合と RDBMS を使用する場合で結果が異なる場合があることにも注意してください。

于 2013-11-01T20:48:03.103 に答える
0

お気づきのように、このタイプの処理は RDBMS で実行できますが、RDBMS だけでは実行できません。WINDOW最新の ANSI SQL 標準に準拠しているか、少なくとも機能を備えた機能をサポートする RDMBS が必要PARTITIONです。例: PostgreSQL、Teradata、SQL Server 2012 など... 注: MySQL は機能をサポートしていないためありませんWINDOW

于 2013-11-01T06:51:22.800 に答える