SAS通过2个数据集进行循环/查找
我有两个数据集,一个大一个小。虽然功能在这里最重要,但效率也很重要,因为大型数据集可能包含数千万条记录。让我们把我的大数据集称为“交易”,把我的小数据集称为“价格”。在事务文件中,有一组“Store”的值。对于每个“商店”,我想创建一个相关“产品”的哈希表,对于每个唯一的“Saledate”,将所有产品的“价格”拉入输出表,而不仅仅是关联的“产品”,而是在该“商店”的交易数据集中找到的所有“产品” 以下是“事务”数据集的示例: 下面是“价格”数据集的示例: 下面是这个场景所需的输出(星号表示价格是通过查找从“价格”插入到“交易”中的) 基本上,在伪代码中,想法是通过每个商店进行循环,查找其不同产品和销售日期的列表,然后在价格数据中找到这些产品和销售日期的相应价格,如果还没有,则插入它们。在本例中,由于苹果在“交易”中的saledate为1/1,因此我还需要胡椒粉的saledate(来自“价格”)。这同样适用于1/2,但反之亦然,因为辣椒的价格已经存在,但苹果的价格没有。1/5在“价格”上有记录,但它不是必需的,因为苹果和胡椒在“交易”中都没有记录。对于另一家商店,存在不同的产品,所以胡椒根本不相关,但芒果是 我已经尝试了几种方法,但无法摆脱我认为必要的“双重”查找障碍SAS通过2个数据集进行循环/查找,sas,hashtable,lookup,Sas,Hashtable,Lookup,我有两个数据集,一个大一个小。虽然功能在这里最重要,但效率也很重要,因为大型数据集可能包含数千万条记录。让我们把我的大数据集称为“交易”,把我的小数据集称为“价格”。在事务文件中,有一组“Store”的值。对于每个“商店”,我想创建一个相关“产品”的哈希表,对于每个唯一的“Saledate”,将所有产品的“价格”拉入输出表,而不仅仅是关联的“产品”,而是在该“商店”的交易数据集中找到的所有“产品” 以下是“事务”数据集的示例: 下面是“价格”数据集的示例: 下面是这个场景所需的输出(星号表示价格
以下是与此新问题相关的上一个问题/答案的链接。答案提供了创建虚拟表的示例代码 我认为您可以通过一系列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;