Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按组比较上一行和上一行,并填充新列_Sql_Sas_Window Functions_Proc Sql - Fatal编程技术网

Sql 按组比较上一行和上一行,并填充新列

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

我需要将组的最后一行与上面的行进行比较,查看是否有几列发生了更改,如果发生更改,则用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建模中使用它们。想让事情简短而甜蜜。

使用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。