Sql 按组比较上一行和上一行,并填充新列
我需要将组的最后一行与上面的行进行比较,查看是否有几列发生了更改,如果发生更改,则用1填充一个新列。下面的数据演示将更好地解释 还需要考虑只有一行的组 我们所拥有的:Sql 按组比较上一行和上一行,并填充新列,sql,sas,window-functions,proc-sql,Sql,Sas,Window Functions,Proc Sql,我需要将组的最后一行与上面的行进行比较,查看是否有几列发生了更改,如果发生更改,则用1填充一个新列。下面的数据演示将更好地解释 还需要考虑只有一行的组 我们所拥有的: Group Name Sport DogName Eligibility 1 Tom BBALL Toto Yes 1 Tom BBall Toto Yes 1 Tom golf
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建模中使用它们。想让事情简短而甜蜜。使用data step和lag语句。确保首先按组对数据进行排序,并且组中的行按正确顺序排序。使用数组将使代码更小 下面的逻辑将每一行与前一行进行比较。只有在以下情况下,才会设置标志1:
var=(测试逻辑)代码>是自动生成虚拟标志的快捷方式
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;
使用data step和lag语句。确保首先按组对数据进行排序,并且组中的行按正确顺序排序。使用数组将使代码更小
下面的逻辑将每一行与前一行进行比较。只有在以下情况下,才会设置标志1:
这不是小组的第一排
当前值与以前的值不同
语法var=(测试逻辑)代码>是自动生成虚拟标志的快捷方式
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;
程序程序员在SQL中发现这种困境并不少见,SQL主要是一种集合语言,其中行没有位置。如果您编写了一个读取select数据(按所需顺序排序)的过程,它可以使用变量来控制在输出中创建所需的附加列,类似于上面的lag函数
或者您可以将其放入电子表格中,这样更容易检测公式填充列=if(a2a1,1,0)中的更改。只需确保没有人将电子表格数据重新排序为新的顺序 过程程序员在SQL中发现这种困境并不少见,SQL主要是一种集合语言,其中行没有位置。如果您编写了一个读取select数据(按所需顺序排序)的过程,它可以使用变量来控制在输出中创建所需的附加列,类似于上面的lag函数
或者您可以将其放入电子表格中,这样更容易检测公式填充列=if(a2a1,1,0)中的更改。只需确保没有人将电子表格数据重新排序为新的顺序 要获得“上面的行”,需要指定行顺序。是哪一行?哎呀,行已经排序要获得“上面的行”,您需要指定行排序。是哪一个?哎呀,行已经排序了电子表格的想法很好,不幸的是,有成千上万的团体需要这样做。最终的产品是什么?如果你把它放在一张表格里,除非排序正确,否则就没有意义了。电子表格的想法很好,不幸的是,有成千上万的团体需要这样做。最终的产品是什么?如果你把它放在一个表中,除非排序正确,否则它就没有意义了。我将drop语句中的“lag”改为“var”,并将第一个dim(var)改为dim(var)。我得到一个错误,即下标超出范围,不确定它是否是我的数据。我使用$symbol强制lagvar数组为字符。看看这是否有帮助。同样的错误。即使是强制upcase和条带化空格也会重新加载数据。它也无法识别drop语句中的任何内容,我尝试了lag和var。我将drop语句中的“lag”更改为“var”,并将第一个dim(var)更改为dim(var)。我得到一个错误,即下标超出范围,不确定它是否是我的数据。我使用$symbol强制lagvar数组为字符。看看这是否有帮助。同样的错误。即使是强制upcase和条带化空格也会重新加载数据。它也无法识别drop语句中的任何内容,我尝试了lag和var。