2016-04-30 11 views
0

私は結合と結合の間のハイブリッドのようなルックアップを探しています。私は主なデータセットに多数のレコードを持っているので、多対多のマトリックスの "ブルートフォース"メソッドではない何かをしようとしています。SASハッシュテーブル(右結合/結合)

ここには、リストされた各製品の価格が既に含まれている「すべて」という主なデータセットがあります。

product date  price 
apple 1/1/2011 1.05  
apple 1/3/2011 1.02 
apple 1/4/2011 1.07 

pepper 1/2/2011 0.73 
pepper 1/3/2011 0.75 
pepper 1/6/2011 0.79 

私の他のデータセットは、(「価格は」 - ここに示したが、同じ2つのキーは、製品と日付が含まれていない)可能性のある各日付に、すべての製品の価格が含まれています。私が作成したいと考え、ルックアップハッシュテーブルは、基本的に「すべての」テーブル内のすべての日付を見て、このような表が得られ、その日のためにALL製品、用の出力の価格になります。

product date  price 
apple 1/1/2011 1.05  
pepper 1/1/2011 0.71 * 
apple 1/2/2011 1.04 * 
pepper 1/2/2011 0.73 
apple 1/3/2011 1.02 
pepper 1/3/2011 0.75 
apple 1/4/2011 1.07 
pepper 1/4/2011 0.76 * 
apple 1/6/2011 1.10 * 
pepper 1/6/2011 0.79 

つまり、1つの製品に日付と価格が「すべて」のテーブルが指定されている限り、他のすべての製品は、ルックアップテーブルからその商品を引き取る必要があります。 アスタリスクは、priceテーブルから価格が検索され、製品の価格を含む新しい行が基本的に新しいテーブルに挿入されたことを示します。

ハッシュテーブルではこれを行うには適していない場合は、別の方法を教えてください。

+0

希望するWANTデータセットは、PRICESデータセットのサブセットですか? (DATEがALLの日付の1つであるPRICESのレコード?)。 ALLとPRICESのレコード数はいくつですか? – Quentin

+0

この例では、yesを指定します。現実にはすべて、実際にキーごとに数千のトランザクションがあります。価格には異なる商品、日付、価格が表示されます。だから私はここでハッシュがしっかりしていると思った。 – AidKulesh

+0

しかし、はい、そのアイデアは、すべての製品について、その日付のうち少なくとも1つの製品がリストされている限り、価格はすべての製品に必要です。 – AidKulesh

答えて

1

これはエレガントではありませんが、好きな結果が得られるかどうか不思議です。あなたが保守したいと思うすべてのキーに複数のレコードがあるので、私は基本的に、ALLの日付を持つPRICESのレコードとALLを結合しますが、すでにALLに入っていたレコードを除外するようにExceptを追加しました。これが理にかなっているのか、あなたが望むことをしているのかは分かりません。確かに「エレガントな」資格はありません。

data all; 
    input product $7. date mmddyy10. price; 
    Y=1; 
    format date mmddyy10.; 
    cards; 
apple 01/01/2011 1.05 
apple 01/01/2011 1.05 
apple 01/03/2011 1.02 
pepper 01/02/2011 0.73 
pepper 01/03/2011 0.75 
pepper 01/06/2011 0.79 
; 
run; 
data prices; 
    input product $7. date mmddyy10. price; 
    format date mmddyy10.; 
    cards; 
apple 01/01/2011 1.05 
apple 01/02/2011 1.04 
apple 01/03/2011 1.02 
apple 01/04/2011 1.07 
apple 01/05/2011 1.01 
pepper 01/01/2011 0.70 
pepper 01/02/2011 0.73 
pepper 01/03/2011 0.75 
pepper 01/04/2011 0.76 
pepper 01/05/2011 0.77 
pepper 01/06/2011 0.79 
; 
run; 

proc sql; 
    create table want as 
    select * from all 
    union corr all 
    ((select product,date,price from 
     prices 
     where date IN (select distinct date from all) 
    ) 
    except corr 
    select product,date,price from all 
) 
    ; 
quit; 
+0

ありがとう、私はこれがかなりいいと思います。唯一のことは...データセットALLには、リストされていない複数のフィールドがありますが、削除しないフィールドはありません。私はcorr /すべてのキーワードをよく知っていませんが、ここでcorrキーワードは2つのテーブル間の対応する列だけをオーバーレイするよう指定しています。 ALLには約30のフィールドがあり、価格には6つしかありません(うち3つを除くすべてを削除できます)。これを実行すると、corr/allの組み合わせがあってもなくても、私はまだエラーになります... – AidKulesh

+0

- 警告:EXCEPT設定操作を実行するために、テーブルがNULL列で拡張されました。 エラー:EXCEPTの最初の投稿者の列6は、 秒の対応するものと同じ種類ではありません。 エラー:EXCEPTの最初のコントリビュータの列7は、 秒の対応するものと同じ型ではありません。これは簡単に修正可能ですか? – AidKulesh

+0

私は、 "挿入された行"がすべて完全にNULLであれば気にしません。問題は、製品、価格、日付の各フィールドに値が設定されていることです。 – AidKulesh