Sas 为同一组生成唯一ID

Sas 为同一组生成唯一ID,sas,sas-macro,Sas,Sas Macro,我有数据集 CustID Rating 1 A 1 A 1 B 2 A 2 B 2 C 2 D 3 X 3 X 3 Z 4 Y 4 Y 5 M 6 N 7 O 8 U 8 T 8 U 预期产量 CustID Rating ID 1 A 1 1 A 1 1 B 1 2 A 1 2 B 2 2 C 3 2 D 4 3 X 1 3 X 1 3 Z

我有数据集

CustID  Rating
1   A
1   A
1   B
2   A
2   B
2   C
2   D
3   X
3   X
3   Z
4   Y
4   Y
5   M
6   N
7   O
8   U
8   T
8   U
预期产量

CustID  Rating  ID
1   A   1
1   A   1
1   B   1
2   A   1
2   B   2
2   C   3
2   D   4
3   X   1
3   X   1
3   Z   2
4   Y   1
4   Y   1
5   M   1
6   N   1
7   O   1
8   U   1
8   T   2
8   U   1

在下面的解决方案中,我将不同的可能评级选择到一个宏变量中,以便在数组语句中使用。然后在ratings tolumn中搜索这些不同的值,以返回在每次成功查找时分配的编号

在这种情况下,可以通过将
%sysfunc
替换为3(不同评级的数量,如果您事先知道的话)来避免宏语句。但是如果您不知道的话,
%sysfunc
语句有助于解决这个问题

data have;
  input CustomerID    Rating $;
  cards;
  1           A       
  1           A       
  1           B       
  2           A       
  2           A       
  3           A       
  3           A       
  3           B       
  3           C     
  ;
run; 

proc sql noprint;
 select distinct quote(strip(rating)) into :list separated by ' '
 from have
 order by 1;
 %put &list.;
quit;
如果您事先知道号码:

data want;
  set have;
  array num(3) $ _temporary_ (&list.);
  do i = 1 to dim(num);
    if findw(rating,num(i),'tips')>0 then id = i;
  end;
    drop i;
 run; 
否则:

%macro Y;
data want;
  set have;
  array num(%sysfunc(countw(&list., %str( )))) $ _temporary_ (&list.);
  do i = 1 to dim(num);
    if findw(rating,num(i),'tips')>0 then id = i;
  end;
    drop i;
 run; 
%mend;
%Y;
输出:

Obs CustomerID Rating id 
1    1          A      1 
2    1          A      1 
3    1          B      2 
4    2          A      1 
5    2          A      1 
6    3          A      1 
7    3          A      1 
8    3          B      2 
9    3          C      3 

假设数据按customerid和评级排序(如原始未编辑问题)。以下是您想要的:

data want;
   set have;
   by customerid rating;

   if first.customerid then
      id = 0;

   if first.rating then
      id + 1;
run;

到目前为止你试过什么?您可以添加该代码并询问什么不起作用以及您期望的是什么,因此这不是为了帮助您编写代码。您必须首先尝试。您需要每个评级的ID都是唯一的还是每个客户的每个评级的ID都是唯一的?例如,如果您有
CustomerID=4
Rating=B
,您对
Id
的期望是什么?这里的Id是1。我想知道,同一个客户是否分配了多个评级。@Chetan提供的答案不能解决您的问题吗?输出行
1b1
是否应该
1b2
。如果没有,请你解释一下为什么会像你所展示的那样。谢谢。谢谢,但它不起作用…有两个角度…一个是customerId和第二个评级…我想知道每个客户应该只有一个评级…如果同一个customerId重复相同的评级…那么它应该赋值1这如何反映在您在问题中提供的所需输出中?列ID在您的问题中出现在哪里?ID是计算列。如果我添加更多评分,它将不起作用。我已使用一些附加数据点更新了问题。您更新的问题与初始问题完全不同。你还没有解释你新问题背后的逻辑。如果你连自己的问题都无法描述,那么很难帮助你。我正忙着解决我的问题谢谢。如果工作正常,则得3分:1)请将答案标记为正确;2) 修正问题中的输出以符合您的要求,例如
1b1
应该是
1b2
;3) 正如您从所有评论中所看到的,您的问题中没有足够的信息,因此对所需逻辑的更详细描述意味着您可以更快地得到答案,例如,“在每个
客户id
组中,对于
评级的每个唯一值,增量
id
”可能会有所帮助。我原本有另一个解决方案,因为我认为你想要一些不同的东西。