SAS通过2个数据集进行循环/查找

SAS通过2个数据集进行循环/查找,sas,hashtable,lookup,Sas,Hashtable,Lookup,我有两个数据集,一个大一个小。虽然功能在这里最重要,但效率也很重要,因为大型数据集可能包含数千万条记录。让我们把我的大数据集称为“交易”,把我的小数据集称为“价格”。在事务文件中,有一组“Store”的值。对于每个“商店”,我想创建一个相关“产品”的哈希表,对于每个唯一的“Saledate”,将所有产品的“价格”拉入输出表,而不仅仅是关联的“产品”,而是在该“商店”的交易数据集中找到的所有“产品” 以下是“事务”数据集的示例: 下面是“价格”数据集的示例: 下面是这个场景所需的输出(星号表示价格

我有两个数据集,一个大一个小。虽然功能在这里最重要,但效率也很重要,因为大型数据集可能包含数千万条记录。让我们把我的大数据集称为“交易”,把我的小数据集称为“价格”。在事务文件中,有一组“Store”的值。对于每个“商店”,我想创建一个相关“产品”的哈希表,对于每个唯一的“Saledate”,将所有产品的“价格”拉入输出表,而不仅仅是关联的“产品”,而是在该“商店”的交易数据集中找到的所有“产品”

以下是“事务”数据集的示例:

下面是“价格”数据集的示例:

下面是这个场景所需的输出(星号表示价格是通过查找从“价格”插入到“交易”中的)

基本上,在伪代码中,想法是通过每个商店进行循环,查找其不同产品和销售日期的列表,然后在价格数据中找到这些产品和销售日期的相应价格,如果还没有,则插入它们。在本例中,由于苹果在“交易”中的saledate为1/1,因此我还需要胡椒粉的saledate(来自“价格”)。这同样适用于1/2,但反之亦然,因为辣椒的价格已经存在,但苹果的价格没有。1/5在“价格”上有记录,但它不是必需的,因为苹果和胡椒在“交易”中都没有记录。对于另一家商店,存在不同的产品,所以胡椒根本不相关,但芒果是

我已经尝试了几种方法,但无法摆脱我认为必要的“双重”查找障碍


以下是与此新问题相关的上一个问题/答案的链接。答案提供了创建虚拟表的示例代码

我认为您可以通过一系列SQL语句来完成所需的任务

data trans;
format Store $1. Product $6. SaleDate mmddyy10. price best.;
informat SaleDate mmddyy10.;
input Store $ Product $ SaleDate price;
datalines;
A       apple   1/1/2011  1.05
A       apple   1/3/2011  1.02
A       apple   1/4/2011  1.07
A       pepper  1/2/2011  0.73
A       pepper  1/3/2011  0.75
A       pepper  1/6/2011  0.79
B       apple   1/1/2011  1.05
B       apple   1/3/2011  1.02
B       apple   1/4/2011  1.07
B       mango  1/2/2011  2.42
B       mango  1/3/2011  2.43
B       mango  1/6/2011  2.46
;

data prices;
format Product $6. SaleDate mmddyy10. price best.;
informat SaleDate mmddyy10.;
input Product $ SaleDate price;
datalines;
apple   1/1/2011    1.05
apple   1/2/2011    1.06
apple   1/3/2011    1.02
apple   1/4/2011    1.07
apple   1/5/2011    1.10
apple   1/6/2011    1.15
pepper  1/1/2011    0.74
pepper  1/2/2011    0.73
pepper  1/3/2011    0.75
pepper  1/4/2011    0.75
pepper  1/5/2011    0.75
pepper  1/6/2011    0.79
mango   1/1/2011    2.40
mango   1/2/2011    2.42
mango   1/3/2011    2.43
mango   1/4/2011    2.44
mango   1/5/2011    2.45
mango   1/6/2011    2.46
;

proc sql noprint;
/*Store and Date Combinations*/
create table store_dates as
select distinct store, saledate
    from trans;

/*Store and Product Combinations*/
create table store_products as
select distinct store, product
    from trans;

/*Full Joins the combination tables and look up the price with a left join*/
create table want as
select a.store,
       b.product,
       a.saledate,
       c.price
    from store_dates as a
      full join
         store_products as b
        on a.store=b.store
      left join
         prices as c
      on b.product = c.product
     and a.saledate = c.saledate
    order by a.store, a.saledate, b.product;
quit;
这假设TRANS和Price之间没有价格差异。如果是这样,请添加另一个TRANS左连接和一个coalesce()来处理

        Product Saledate    Price
        apple   1/1/2011    1.05  
        apple   1/2/2011    1.06
        apple   1/3/2011    1.02
        apple   1/4/2011    1.07
        ...

        pepper  1/1/2011    0.74
        pepper  1/2/2011    0.73
        pepper  1/3/2011    0.75
        pepper  1/4/2011    0.75
        pepper  1/5/2011    0.75    
        pepper  1/6/2011    0.79
        ...

        mango   1/1/2011    2.40
        mango   1/2/2011    2.42
        ...
 Store  Product Saledate    Price
 A      apple   1/1/2011    1.05    
 A      pepper  1/1/2011    0.74 *
 A      apple   1/2/2011    1.06 *
 A      pepper  1/2/2011    0.73
 A      apple   1/3/2011    1.02
 A      pepper  1/3/2011    0.75
 A      apple   1/4/2011    1.07
 A      pepper  1/4/2011    0.75 *
 A      apple   1/6/2011    1.10 *
 A      pepper  1/6/2011    0.79
data trans;
format Store $1. Product $6. SaleDate mmddyy10. price best.;
informat SaleDate mmddyy10.;
input Store $ Product $ SaleDate price;
datalines;
A       apple   1/1/2011  1.05
A       apple   1/3/2011  1.02
A       apple   1/4/2011  1.07
A       pepper  1/2/2011  0.73
A       pepper  1/3/2011  0.75
A       pepper  1/6/2011  0.79
B       apple   1/1/2011  1.05
B       apple   1/3/2011  1.02
B       apple   1/4/2011  1.07
B       mango  1/2/2011  2.42
B       mango  1/3/2011  2.43
B       mango  1/6/2011  2.46
;

data prices;
format Product $6. SaleDate mmddyy10. price best.;
informat SaleDate mmddyy10.;
input Product $ SaleDate price;
datalines;
apple   1/1/2011    1.05
apple   1/2/2011    1.06
apple   1/3/2011    1.02
apple   1/4/2011    1.07
apple   1/5/2011    1.10
apple   1/6/2011    1.15
pepper  1/1/2011    0.74
pepper  1/2/2011    0.73
pepper  1/3/2011    0.75
pepper  1/4/2011    0.75
pepper  1/5/2011    0.75
pepper  1/6/2011    0.79
mango   1/1/2011    2.40
mango   1/2/2011    2.42
mango   1/3/2011    2.43
mango   1/4/2011    2.44
mango   1/5/2011    2.45
mango   1/6/2011    2.46
;

proc sql noprint;
/*Store and Date Combinations*/
create table store_dates as
select distinct store, saledate
    from trans;

/*Store and Product Combinations*/
create table store_products as
select distinct store, product
    from trans;

/*Full Joins the combination tables and look up the price with a left join*/
create table want as
select a.store,
       b.product,
       a.saledate,
       c.price
    from store_dates as a
      full join
         store_products as b
        on a.store=b.store
      left join
         prices as c
      on b.product = c.product
     and a.saledate = c.saledate
    order by a.store, a.saledate, b.product;
quit;