【问题标题】:SAS assigning numbers and partitioning by accountSAS分配编号和按帐户分区
【发布时间】:2017-09-14 18:42:40
【问题描述】:

我使用 SAS EG 并且有一个如下所示的数据集:

CLIENT_ID    Segment     Yearmonth
XXXX         A            201305
XXXX         A            201306
XXXX         A            201307
YYYY         A            201305
YYYY         A            201306
YYYY         B            201307

我想要一个分配给新列的数字的输出,该数字在新帐户存在时重置:

CLIENT_ID    Segment      Yearmonth    New_Variable    
XXXX         A            201305         1
XXXX         A            201306         2
XXXX         A            201307         3
YYYY         A            201305         1
YYYY         A            201306         2
YYYY         B            201307         3

这是第一个问题,我用这段代码解决了这个问题:

PROC SORT DATA= GENERAL.HISTORICAL_SEGMENTS;
by Client_ID;
RUN;

data HISTORICAL_SEGMENTS2;
SET GENERAL.HISTORICAL_SEGMENTS;
count + 1;
by Client_ID;
if first.Client_ID then count = 1;
run;

我想创建第二个数据集,我想看看是否有办法仅在段发生变化时获取段:例如从上面的

CLIENT_ID    Segment      Yearmonth    New_Variable
YYYY         A            201305         1
YYYY         B            201306         2

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 请在问题中添加您尝试过的代码(即使它不起作用)。看到你是如何处理它的,通常会帮助其他人帮助你学习,而不仅仅是给你一个答案。您是否熟悉 RETAIN,并在 DATA 步骤中按组处理(例如 first.Account 和 last.Account)?

标签: sas sas-macro enterprise-guide


【解决方案1】:

很好地回答了您的第一个问题。我认为如果你重新排列一下,这一步会更清楚,例如:

data HISTORICAL_SEGMENTS2 ;
  set GENERAL.HISTORICAL_SEGMENTS ;
  by Client_ID ;
  if first.Client_ID then count = 0 ;
  count + 1 ;
run;

为了清楚起见,我认为习惯上将 BY 语句放在它适用的 SET 语句之后。 Client_ID 更改时将计数器重置为 0。

看起来您想要第二个数据集,称为 FIRSTS,其中包含每个分组的第一条记录。为此,请注意一个 DATA 步骤可以写入多个输出数据集。这可以通过使用显式 OUTPUT 语句写入每个数据集来完成,例如:

data HISTORICAL_SEGMENTS2 FIRSTS ;
  set GENERAL.HISTORICAL_SEGMENTS ;
  by Client_ID ;
  if first.Client_ID then count = 0 ;
  count + 1 ;
  output HISTORICAL_SEGMENTS2 ; *output every record;
  if first.Client_ID then output FIRSTS ;  *output first of each group;
run;

【讨论】:

  • 感谢您的回答。现在这很有意义。
  • 仍在努力获取这个逻辑:HISTORICAL_SEGMENTS2 FIRSTS;设置 GENERAL.HISTORICAL_SEGMENTS ;按 Client_ID ;如果 first.Client_ID 然后 count = 0 ;计数 + 1 ;输出 HISTORICAL_SEGMENTS2 ; *输出每条记录;如果 first.Client_ID 则输出 FIRSTS ; *每组的第一个输出;如果 second.segment first.segment 则输出 FIRSTS 运行;基本上我想要一个逻辑,只有当段与前一个段不同时,它才会首先将客户端 ID 输出到表中
  • 对不起,我不明白。建议您将此添加到当前问题中,或者更好地使用更多示例记录开始一个新问题,以显示您希望使用此新逻辑输出的记录。
猜你喜欢
  • 2011-09-04
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多