1

問題はSAS9.1.3にあり、AとBの2つのデータセットがあります。

セットAは、日付と名前を含むメインデータセットです。

data Aa;
    input date name $  ;
    datalines;
    20120102 A 
    20110102 B 
    20120102 C 
    20110102 A 
    20120102 B 
    20110102 C 
    ;

セットBには、セットAにマージしたいデータが含まれています。

data B;
    input date name $  rate;
    datalines;
    20120101 A 0.01
    20120101 B 0.02
    20120101 C 0.03
    20110101 A -0.01
    20110101 B -0.02
    20110101 C -0.03
    ;

SAS procsqlにfetchxxx行がないことを理解しているため、セットBに行数を追加しました。

proc sort data = b; by descending  date  name ;run;
data b1;
    set b;
    ind = _n_;
run;

私がやりたいのは、BからAへの最新のレートをマージすることです。そして私のprocsqlは次のようになります。

proc sql;
    create table new as
    select a.*,b.rate
    from Aa a left join b1 b
    on a.name = b.name and a.date>=b.date
    group by b.ind having min(b.ind)=b.ind; 
quit;

しかし、私の結果は次のようになります。

20110102 A .  

20110102 B .  

20110102 C .  

20120102 A -0.01

20120102 B -0.02 

20120102 C -0.03 

期待される結果は次のとおりです。

20110102 A -0.01  

20110102 B -0.02  

20110102 C -0.03  

20120102 A 0.01

20120102 B 0.02 

20120102 C 0.03 
4

1 に答える 1

1

Bに行カウンターを追加する必要はありません。とにかく、サイドバイサイドマージを実行していません。

これはうまくいくと思います(私はAaの名前をAに変更します):

proc sql;
create table C as
select _A.date, _A.name, b.rate from (
    select date, name, max(b_date) as b_date from (
        select a.*, b.rate, b.date as b_date from a
        left join b
        on a.name = b.name
           and a.date gt b.date)
    group by name, date) _A 
    left join b
    on _A.name=b.name
    and _A.b_Date=b.date;
quit;

基本的な概念は、最初にデカルト結合、つまりA.date> B.dateである可能性のあるすべての行の結合を構築し、次に日付の差が最も小さい行に基づいてフィルターをかけ、どの行/日付に必要なレート。次に、Bテーブルに戻って結合し、レート自体を取得します。

于 2013-03-05T23:03:26.433 に答える