Sas 仅按组显示在一列中更改的连续观察结果

Sas 仅按组显示在一列中更改的连续观察结果,sas,dataset,rows,Sas,Dataset,Rows,我有下面的数据集,我只想显示客户根据合同编号更改了中心代码的连续行 数据集1 Date Customer Contract_No Centre_code 09Jul19 AAAAA AAAAA1234 319 10Jul19 AAAAA AAAAA1234 319 11Jul19 AAAAA AAAAA1234 102 09Jul19 AAAAA AAAAA5678 102 10Jul19 AAAAA AAAAA5678 102 11Jul19

我有下面的数据集,我只想显示客户根据合同编号更改了中心代码的连续行

数据集1

  Date Customer Contract_No Centre_code
    09Jul19 AAAAA AAAAA1234 319
    10Jul19 AAAAA AAAAA1234 319
    11Jul19 AAAAA AAAAA1234 102
    09Jul19 AAAAA AAAAA5678 102
    10Jul19 AAAAA AAAAA5678 102
    11Jul19 AAAAA AAAAA5678 319
    09Jul19 BBBBB BBBBB1234 515
    10Jul19 BBBBB BBBBB1234 515
    11Jul19 BBBBB BBBBB1234 515
    09Jul19 BBBBB BBBBB11878 511
    10Jul19 BBBBB BBBBB11878 511
    11Jul19 BBBBB BBBBB11878 515
    10Jul19 BBBBB BBBBB48741 511
    10Jul19 BBBBB BBBBB48741 511
    11Jul19 BBBBB BBBBB48741 515
Date Customer Contract_No Centre_code
10Jul19 AAAAA AAAAA1234 319
11Jul19 AAAAA AAAAA1234 102
10Jul19 AAAAA AAAAA5678 102
11Jul19 AAAAA AAAAA5678 319
10Jul19 BBBBB BBBBB11878 511
11Jul19 BBBBB BBBBB11878 515
10Jul19 BBBBB BBBBB48741 511
11Jul19 BBBBB BBBBB48741 515
数据集2

Date Customer Contract_No Centre_code
10-Jul-19 AAAAA AAAAA1234 319
11-Jul-19 AAAAA AAAAA1234 319
12-Jul-19 AAAAA AAAAA1234 319
13-Jul-19 AAAAA AAAAA1234 319
14-Jul-19 AAAAA AAAAA1234 319
15-Jul-19 AAAAA AAAAA1234 319
16-Jul-19 AAAAA AAAAA1234 319
17-Jul-19 AAAAA AAAAA1234 319
18-Jul-19 AAAAA AAAAA1234 319
19-Jul-19 AAAAA AAAAA1234 319
20-Jul-19 AAAAA AAAAA1234 319
21-Jul-19 AAAAA AAAAA1234 319
22-Jul-19 AAAAA AAAAA1234 102
   Date Customer Contract_No Centre_code
    21-Jul-19 AAAAA AAAAA1234 319
    22-Jul-19 AAAAA AAAAA1234 102
期望输出数据集1

Date Customer Contract_No Centre_code
10Jul19 AAAAA AAAAA1234 319
11Jul19 AAAAA AAAAA1234 102
10Jul19 AAAAA AAAAA5678 102
11Jul19 AAAAA AAAAA5678 319
10Jul19 BBBBB BBBBB11878 511
11Jul19 BBBBB BBBBB11878 515
10Jul19 BBBBB BBBBB48741 511
11Jul19 BBBBB BBBBB48741 515
期望输出数据集2

Date Customer Contract_No Centre_code
10-Jul-19 AAAAA AAAAA1234 319
11-Jul-19 AAAAA AAAAA1234 319
12-Jul-19 AAAAA AAAAA1234 319
13-Jul-19 AAAAA AAAAA1234 319
14-Jul-19 AAAAA AAAAA1234 319
15-Jul-19 AAAAA AAAAA1234 319
16-Jul-19 AAAAA AAAAA1234 319
17-Jul-19 AAAAA AAAAA1234 319
18-Jul-19 AAAAA AAAAA1234 319
19-Jul-19 AAAAA AAAAA1234 319
20-Jul-19 AAAAA AAAAA1234 319
21-Jul-19 AAAAA AAAAA1234 319
22-Jul-19 AAAAA AAAAA1234 102
   Date Customer Contract_No Centre_code
    21-Jul-19 AAAAA AAAAA1234 319
    22-Jul-19 AAAAA AAAAA1234 102

只需在BY语句中使用NOTSORTED关键字

data have;
  length Date 8 Customer $8 Contract_No $20 Center_code 8;
  input Date Customer Contract_No Center_code ;
  informat date date.;
  format date date9.;
cards;
09Jul19 AAAAA AAAAA1234 319
10Jul19 AAAAA AAAAA1234 319
11Jul19 AAAAA AAAAA1234 102
09Jul19 AAAAA AAAAA5678 102
10Jul19 AAAAA AAAAA5678 102
11Jul19 AAAAA AAAAA5678 319
09Jul19 BBBBB BBBBB1234 515
10Jul19 BBBBB BBBBB1234 515
11Jul19 BBBBB BBBBB1234 515
09Jul19 BBBBB BBBBB11878 511
10Jul19 BBBBB BBBBB11878 511
11Jul19 BBBBB BBBBB11878 515
10Jul19 BBBBB BBBBB48741 511
10Jul19 BBBBB BBBBB48741 511
11Jul19 BBBBB BBBBB48741 515
;

data want;
 set have;
 by customer contract_no Center_code notsorted;
 if last.Center_code;
run;
结果:

从注释中可以看出,当中心代码发生任何更改时,您希望列出所有中心,而不是列出发生更改的位置。一种方法是检查中心代码是否与第一个中心代码不同。您可以通过两个DO循环来实现这一点。一个用于测试更改,另一个用于在发生更改时输出记录。我们可以继续检查LAST.CENTER_CODE标志,以防同一中心代码在一行中的多个日期出现

proc sort data=have;
  by customer contract_no date center_code;
run;

data want;
  do until(last.contract_no);
    set have;
    by customer contract_no ;
    if first.contract_no then first_center=center_code;
    if center_code ne first_center then change=1;
  end;
  do until(last.contract_no);
    set have;
    by customer contract_no center_code notsorted;
    if change and last.center_code then output;
  end;
run;
结果:
只需在BY语句中使用NOTSORTED关键字即可

data have;
  length Date 8 Customer $8 Contract_No $20 Center_code 8;
  input Date Customer Contract_No Center_code ;
  informat date date.;
  format date date9.;
cards;
09Jul19 AAAAA AAAAA1234 319
10Jul19 AAAAA AAAAA1234 319
11Jul19 AAAAA AAAAA1234 102
09Jul19 AAAAA AAAAA5678 102
10Jul19 AAAAA AAAAA5678 102
11Jul19 AAAAA AAAAA5678 319
09Jul19 BBBBB BBBBB1234 515
10Jul19 BBBBB BBBBB1234 515
11Jul19 BBBBB BBBBB1234 515
09Jul19 BBBBB BBBBB11878 511
10Jul19 BBBBB BBBBB11878 511
11Jul19 BBBBB BBBBB11878 515
10Jul19 BBBBB BBBBB48741 511
10Jul19 BBBBB BBBBB48741 511
11Jul19 BBBBB BBBBB48741 515
;

data want;
 set have;
 by customer contract_no Center_code notsorted;
 if last.Center_code;
run;
结果:

从注释中可以看出,当中心代码发生任何更改时,您希望列出所有中心,而不是列出发生更改的位置。一种方法是检查中心代码是否与第一个中心代码不同。您可以通过两个DO循环来实现这一点。一个用于测试更改,另一个用于在发生更改时输出记录。我们可以继续检查LAST.CENTER_CODE标志,以防同一中心代码在一行中的多个日期出现

proc sort data=have;
  by customer contract_no date center_code;
run;

data want;
  do until(last.contract_no);
    set have;
    by customer contract_no ;
    if first.contract_no then first_center=center_code;
    if center_code ne first_center then change=1;
  end;
  do until(last.contract_no);
    set have;
    by customer contract_no center_code notsorted;
    if change and last.center_code then output;
  end;
run;
结果:

如果通过

更改了中心代码的连续行

您的意思是,要查看更改前的观察结果和更改后的观察结果,可以使用FIRST.CENTER_代码和LAST.CENTER_代码标志。(确保使用NOTSORTED关键字,因为记录是按日期排序的,而不是合同中的中心代码。\u NO值。)如果您还删除了第一个中心代码的第一个观察值和最后一个中心代码的最后一个观察值,则您将只获得至少有一个更改的合同

data want;
  set have ;
  by customer contract_no center_code notsorted ;
  if (last.center_code and not last.contract_no) 
     or (first.center_code and not first.contract_no)
  ;
run;
如果

更改了中心代码的连续行

您的意思是,要查看更改前的观察结果和更改后的观察结果,可以使用FIRST.CENTER_代码和LAST.CENTER_代码标志。(确保使用NOTSORTED关键字,因为记录是按日期排序的,而不是合同中的中心代码。\u NO值。)如果您还删除了第一个中心代码的第一个观察值和最后一个中心代码的最后一个观察值,则您将只获得至少有一个更改的合同

data want;
  set have ;
  by customer contract_no center_code notsorted ;
  if (last.center_code and not last.contract_no) 
     or (first.center_code and not first.contract_no)
  ;
run;


你写过代码吗?您是否收到任何错误消息?因此,它不是一个代码编写服务。为什么输出中的
10Jul19 aaaaaaaa5678 102
?中心代码与上一行相同。您是否真的在按客户+合同查找中心的更改,实际上是希望检查客户+合同+中心的连续组,并首先选择
行。
发生?您是在编写SQL还是数据步骤?在数据步骤中,您以前是否将
BY
语句与
NOTSORTED
一起使用过?我使用的是日期步骤,但它没有返回预期的输出。对于您的问题,对于AAAA 5678,在19年7月10日之前,中心代码为102,在19年7月11日改为319。我希望在我的报告中显示这种更改。为什么此行不在期望的输出中<代码>09Jul19 BBBBB BBBBB 1234 515,或者可能
11Jul19 BBBBB BBBBB 1234 515
,因为中心代码没有更改。如果您注意到,所需的输出仅显示连续两个日期的中心代码列中有变化的行。合同号BBB 1234没有任何变化。你写过代码吗?您是否收到任何错误消息?因此,它不是一个代码编写服务。为什么输出中的
10Jul19 aaaaaaaa5678 102
?中心代码与上一行相同。您是否真的在按客户+合同查找中心的更改,实际上是希望检查客户+合同+中心的连续组,并首先选择
行。
发生?您是在编写SQL还是数据步骤?在数据步骤中,您以前是否将
BY
语句与
NOTSORTED
一起使用过?我使用的是日期步骤,但它没有返回预期的输出。对于您的问题,对于AAAA 5678,在19年7月10日之前,中心代码为102,在19年7月11日改为319。我希望在我的报告中显示这种更改。为什么此行不在期望的输出中<代码>09Jul19 BBBBB BBBBB 1234 515,或者可能
11Jul19 BBBBB BBBBB 1234 515
,因为中心代码没有更改。如果您注意到,所需的输出仅显示连续两个日期的中心代码列中有变化的行。合同号BBB 1234没有任何更改。您的代码工作正常,但我想获得连续两个日期的中心代码更改。代码还显示例如BBB 1234合同号。虽然它没有更改中心代码,但在第一次发生更改时更容易检测到更改。那么,可以获取新合同的第一个日期而不是最后一个日期吗?更新了答案,包括一种识别多个中心合同的方法。感谢代码Tom,但是如果有任何方法可以代替第一个日期,我想显示前一个中心代码的最后一个日期在更改为新的中心代码之前。因为我想在我的报告中展示的是变化发生的时间,而不是第一次发生。我在我的问题中添加了数据集2,以便您可以直观地看到我在这里试图解释的内容。数据集2的期望输出也在那里。以某种方式列出更改前的最后日期就足够了。要真正标记更改前的最后一条记录和更改后的第一条记录,需要同时检查中心的上一个值和下一个值。中心的下一个价值是很难做到的,但它是可以做到的。搜索SAS questio示例