检查值的正确顺序

时间:2014-10-28 14:23:33

标签: arrays sas

我有一个类似于下面的数据集。基本上,我有三种不同尺寸的物品类型的当前价格。如果尺寸正确定价(即small<medium<large)我想用“Y”标记它们并继续使用当前价格。如果它们的价格不正确,我想用“N”标记它们并使用建议的价格。我知道这可能是使用数组编程的时候了,但我的阵列技能肯定有点弱。有数百个位置,但只有一个项目类型。我目前在宏变量列表中加载了唯一的位置。

data have;
                input type location $ size $ cur_price rec_price;
cards;
x NY S 4 1
x NY M 5 2
x NY L 6 3
x LA S 5 1
x LA M 4 2
x LA L 3 3
x DC S 5 1
x DC M 5 2
x DC L 5 3
;
run;

proc sql;
                select distinct location into :loc_list from have;
quit;

非常感谢任何帮助。

感谢。

3 个答案:

答案 0 :(得分:1)

我不知道数组在这里会有什么帮助。如何使用dif排查最后一条记录的价格并进行验证(如果您愿意,还可以retain最后一个价格)。确保数据集已正确排序by type location descending size,然后:

data want;
  set have;
  by type location descending size;            *S > M > L alphabetically;
  retain price_check;
  if not first.location and dif(cur_price) lt 0 then price_check=1; 
                                               *if dif < 0 then cur rec is smaller;
  else if first.location then price_check=0;   *reset it;
  if last.location;
  keep type location price_check;
run;

然后将其合并回原始数据集by type location,并使用cur_price=1的其他价格。

答案 1 :(得分:1)

不知道你为什么要在这里使用数组... proc transpose和一些数据步骤逻辑 可以轻松解决这个问题。数组是非常有用的(必须承认,我并非完全 他们也很舒服,但在你有这么多地方的情况下, 我认为转置更好。

以下代码是否可以实现您的目标?

/*sorts to get ready for transpose*/
proc sort data=have;
    by location;
run;

/*transpose current price*/
proc transpose data=have out=cur_tran prefix=cur_price;
    by location;
    id size;
    var cur_price;
run;

/*transpose recommended price*/
proc transpose data=have out=rec_tran prefix=rec_price;
    by location;
    id size;
    var rec_price;
run;

/*merge back together*/
data merged;
    merge cur_tran rec_tran;
    by location;
run;

/*creates flags and new field for final price*/
data want;
    set merged;
    if cur_priceS<cur_priceM<cur_priceL then 
        do;
        FLAG='Y';
        priceS=cur_priceS;
        priceM=cur_priceM;
        priceL=cur_priceL;
        end;
    else do;        
        FLAG='N';
        priceS=rec_priceS;
        priceM=rec_priceM;
        priceL=rec_priceL;
    end;
run;

答案 2 :(得分:0)

或者你可以在一个查询中完成,这几乎是对你的要求的重新陈述。

Proc sql; 
         create  table want as 
         select  * 

/*              Basically, I have current prices for three different sizes of an item type. 
                 If the sizes are priced correctly (ie small<medium<large)  */ 
         ,       case 
                         when    max ( case when size eq 'S' then cur_price end) 
                         lt      max ( case when size eq 'M' then cur_price end) 
                         and     max ( case when size eq 'M' then cur_price end) 
                         lt      max ( case when size eq 'L' then cur_price end) 

/*                      I want to flag them with a “Y” and continue to use the current price */ 
                         then    'Y' 

/*                      If they are not priced correctly, 
                         I want to flag them with a “N” and use the recommended price.   */ 
                         else    'N' 
                 end                             as      Cur_Price_Sizes_Correct 

         ,       case 
                         when    calculate Cur_Price_Correct     eq      'Y' 
                         then    cur_price 
                         else    rec_price 
                 end                             as      Price 

        From    have 

        Group   by      Type 
                 ,       Location 
         ; 
Quit;