sql—按组比较上一行和上一行并填充新列

kd3sttzy  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(550)

我需要比较一个组的最后一行和它上面的行,看看是否有一些列发生了变化,如果发生了变化,用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建模。想让事情简短甜蜜。

db2dz4w8

db2dz4w81#

使用data step和lag语句。确保首先按组对数据进行排序,并且按正确的顺序对组中的行进行排序。使用数组将使代码变得更小。
下面的逻辑将把每一行与前一行进行比较。只有在下列情况下,才会设置标志1:
这不是小组的第一排
当前值与以前的值不同。
语法 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;
vawmfj5a

vawmfj5a2#

对于过程编程人员来说,在sql中发现这种进退两难的情况并不少见,sql主要是一种集合语言,其中行没有位置。如果您编写一个过程来读取select数据(按所需顺序排序),那么它可以使用变量来控制在输出中创建所需的附加列,类似于上面的lag函数。
或者你可以把它放到一个电子表格中,这样更容易检测到公式填充列=if(a2<>a1,1,0)的变化。只需确保没有人将电子表格数据重新排序为新的顺序!

相关问题