I am having trouble with the removedup command in Hash. From what I understand, it remove the current record being pointed in the hash table(memory) and set the pointer to null. Am I missing anything? Basically I have two data set, sales and refunds. I need to merge the refund data back to the original purchase by matching customer_id, product_id in a FIFO basis as long as refund is <= sales which then will proceed to the next purchase. The record will also have all the refund_id added up. But I couldn't get it working properly, if i use removedup, each purchase will just take 1 refund and move to the next. Could someone help me? Thanks. ***** Code **** data Sales; infile datalines dsd; input Customer_id Product_Id $ sales transaction_id $; cards; 1,A1,2,1 1,A1,4,2 1,A2,5,3 2,A1,2,4 2,A2,2,5 ; run; data Refund; infile datalines dsd; input Customer_id Product_Id $ refunds refund_id $; cards; 1,A1,1,r1 1,A1,1,r2 1,A1,1,r3 2,A1,1,r4 ; run; data want; if _n_=1 then do; if 0 then set refund; declare hash h(dataset:'refund',multidata:'y'); h.definekey('Customer_id','Product_Id'); h.definedata('refunds','refund_id'); h.definedone(); end; set sales; by Customer_id Product_Id; format r_id $200.; cum_refund = 0; r_id = ""; call missing(refunds,refund_id); rc=h.find(); do while(rc=0); if sum(refunds, cum_refund) <= sales then do; cum_refund = sum(refunds,cum_refund); r_id = catx("-",r_id,refund_id); *h.removedup(); call missing(refunds,refund_id); rc=h.find_next(); end; else do; leave; end; end; drop refunds refund_id rc; run; ****** Data ******** Have: Sales: Customer_ID Product_id sales Transaction_ID 1 A1 2 1 1 A1 4 2 1 A2 5 3 2 A1 2 4 2 A2 2 5 Refund: Customer_ID Product_id Refund refund_id 1 A1 1 r1 1 A1 1 r2 1 A1 1 r3 2 A1 1 r4 Want : Customer_ID Product_id sales Transaction_ID r_id cum_refund 1 A1 2 1 r1-r2 2 1 A1 4 2 r3 1 1 A2 5 3 0 2 A1 2 4 r4 1 2 A2 2 5 0
... View more