1

我正在为以下问题寻找一个优雅的解决方案,这将有助于避免代码重复。你可以看到这一行:

put auction_id= potential_buyer= ;* THIS GETS REPEATED;

在此代码中重复:

data results;

  attrib potential_buyer length=$1;

  set auction;

  if _n_ eq 1 then do;
    declare hash ht1(dataset:'buyers', multidata: 'y');
    ht1.definekey('auction_id');
    ht1.definedata('potential_buyer');
    ht1.definedone();
    call missing (potential_buyer);
  end;


  **
  ** LOOP THROUGH EACH POTENTIAL BUYER AND PROCESS THEM
  *;
  if ht1.find() eq 0 then do;

    put auction_id= potential_buyer= ;* THIS GETS REPEATED;

    ht1.has_next(result: ht1_has_more);
    do while(ht1_has_more);
      rc = ht1.find_next();

      put auction_id= potential_buyer= ;* THIS GETS REPEATED;

      ht1.has_next(result: ht1_has_more);
    end;
  end;
run;

我已将上面的示例简化为一行,因为真正的代码块相当长且复杂。我想避免使用%macro片段或%include如果可能的话,因为我想将逻辑保留在数据步骤“内”。

以下是一些示例数据:

    data auction;
      input auction_id;
    datalines;
    111
    222
    333
    ;
    run;

    data buyers;
      input auction_id potential_buyer $;
    datalines;
    111 a
    111 c
    222 a
    222 b
    222 c
    333 d
    ;
    run;
4

2 回答 2

3

我想到了。最后结果很简单,只是在我的大脑中遇到了一点麻烦:

data results;

  attrib potential_buyer length=$1;

  set auction;

  if _n_ eq 1 then do;
    declare hash ht1(dataset:'buyers', multidata: 'y');
    ht1.definekey('auction_id');
    ht1.definedata('potential_buyer');
    ht1.definedone();
    call missing (potential_buyer);
  end;


  **
  ** LOOP THROUGH EACH POTENTIAL BUYER AND PROCESS THEM
  *;
  if ht1.find() eq 0 then do;

    keep_processing = 1;
    do while(keep_processing);

      put auction_id= potential_buyer= ;* THIS GETS DOESNT GET REPEATED ANYMORE =);

      ht1.has_next(result: keep_processing);
      rc = ht1.find_next();
    end;
  end;

run;
于 2013-02-22T18:58:03.337 回答
1

您可以通过这种方式解决它....但是 Rob 的答案更好。

data results;

 %Macro NoDuplicate;
  Put auction_id= potential_buyer= ; * No Longer Duplicated;
 %Mend noduplicate;

 attrib potential_buyer length=$1;

 set auction;

 if _n_ eq 1 then do;
  declare hash ht1(dataset:'buyers', multidata: 'y');
  ht1.definekey('auction_id');
  ht1.definedata('potential_buyer');
  ht1.definedone();
  call missing (potential_buyer);
 end;

 **
 ** LOOP THROUGH EACH POTENTIAL BUYER AND PROCESS THEM
 *;
 if ht1.find() eq 0 then do;

  %NoDuplicate

  ht1.has_next(result: ht1_has_more);
  do while(ht1_has_more);
   rc = ht1.find_next();
   %NoDuplicate
   ht1.has_next(result: ht1_has_more);
  end;
 end;

run;
于 2013-02-22T18:54:33.460 回答