【问题标题】:Compare last row to previous row by group and populate new column按组比较最后一行与上一行并填充新列
【发布时间】:2020-08-04 21:01:04
【问题描述】:

我需要将组的最后一行与其上方的行进行比较,查看是否有几列发生更改,如果发生更改,则用 1 填充新列。下面的数据演示会更好地解释。

还需要考虑到只有 1 行的组。

我们有什么:

 Group    Name     Sport     DogName   Eligibility 
   1      Tom      BBALL     Toto        Yes
   1      Tom      BBall     Toto        Yes
   1      Tom      golf      spot        Yes
   2     Nancy     vllyball  Jimmy       yes
   2     Nancy     vllyball  rover       no
  

我们想要什么:

 Group    Name     Sport     DogName   Eligibility N_change  S_change  D_Change  E_change
     1      Tom      BBALL     Toto        Yes      0           0        0       0
     1      Tom      BBall     Toto        Yes      0           0        0       0
     1      Tom      golf      spot        Yes      0           1        1       0
     2     Nancy     vllyball  Jimmy       yes      0           0        0       0
     2     Nancy     vllyball  rover       no       0           0        1       1

只关心组内逐行的变化。提前感谢您的帮助。

这些行已经排序,所以我们只需要最后两个。如果比较一组中的连续行更容易,那么这对我的目的同样有效。

我确实知道这将是数组,但我在处理这些问题时遇到了困难,因为从不将它们用于我的典型 sas 建模。想让事情变得简短而甜蜜。

【问题讨论】:

  • 要获得“上面的行”,您需要指定行顺序。是哪一个?
  • 哎呀,行已经排序了

标签: sql sas window-functions proc-sql


【解决方案1】:

使用数据步长和滞后语句。确保您的数据首先按组排序,并且组内的行以正确的顺序排序。使用数组会让你的代码更小。

下面的逻辑会将每一行与前一行进行比较。只有在以下情况下才会设置标志 1:

  1. 不是组的第一行
  2. 当前值与之前的值不同。

语法var = (test logic); 是自动生成虚拟标志的快捷方式。

data want;
    set have;
    by group;

    array var[*]        name sport dogname eligibility;
    array lagvar[*] $   lag_name lag_sport lag_dogname lag_eligibility;
    array changeflag[*] N_change S_change D_change E_change;

    do i = 1 to dim(var);
        lagvar[i]     = lag(var[i]);
        changeflag[i] = (var[i] NE lagvar[i] AND NOT first.group);
    end;
  
   drop lag: i;
run;

【讨论】:

  • 我将 drop 语句中的 'lag' 更改为 'var' 并将第一个 dim(vars) 更改为 dim(var)。我收到下标超出范围的错误,不确定它是否是我的数据
  • 我使用 $ 符号将 lagvar 数组强制为字符。看看有没有帮助。
  • 同样的错误。甚至强制大写和条纹空格重新加载数据。它也无法识别 drop 语句中的任何内容,我尝试过 lag 和 var。
【解决方案2】:

程序程序员在 SQL 中发现这种困境并不少见,SQL 主要是一种行没有位置的集合语言。如果您编写一个读取选择数据(按所需顺序排序)的过程,它可以有变量来控制在输出中创建所需的附加列,类似于上面的 lag 函数。

或者您可以将其放入电子表格中,这样更容易检测公式填充列 =if(a2a1,1,0) 的变化。只要确保没有人将电子表格数据重新排序为新顺序!

【讨论】:

  • 电子表格的想法很好,不幸的是有成千上万的小组需要这样做。
  • 最终产品是什么?如果你把它放在一个表中,除非排序正确,否则它就没有意义了。
猜你喜欢
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多