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

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

我需要比较一个组的最后一行和它上面的行,看看是否有一些列发生了变化,如果发生了变化,用1填充一个新的列。下面的数据演示将更好地解释。
还需要说明只有一行的组。
我们拥有:

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

我们想要的是:

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

只关心组内行与行之间的更改。提前谢谢你的帮助。
行已经被排序了,所以我们只需要最后两行。如果比较一个组中的连续行更容易,那么就我的目的而言,这也是很好的。
我知道这将是阵列,我与这些斗争,因为从来没有使用它们为我的典型sas建模。想让事情简短甜蜜。

db2dz4w8

db2dz4w81#

使用data step和lag语句。确保首先按组对数据进行排序,并且按正确的顺序对组中的行进行排序。使用数组将使代码变得更小。
下面的逻辑将把每一行与前一行进行比较。只有在下列情况下,才会设置标志1:
这不是小组的第一排
当前值与以前的值不同。
语法 var = (test logic); 是自动生成虚拟标志的快捷方式。

  1. data want;
  2. set have;
  3. by group;
  4. array var[*] name sport dogname eligibility;
  5. array lagvar[*] $ lag_name lag_sport lag_dogname lag_eligibility;
  6. array changeflag[*] N_change S_change D_change E_change;
  7. do i = 1 to dim(var);
  8. lagvar[i] = lag(var[i]);
  9. changeflag[i] = (var[i] NE lagvar[i] AND NOT first.group);
  10. end;
  11. drop lag: i;
  12. run;
展开查看全部
vawmfj5a

vawmfj5a2#

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

相关问题