Sql server SQL或SAS函数根据其他类似记录输入分类变量

Sql server SQL或SAS函数根据其他类似记录输入分类变量,sql-server,sas,Sql Server,Sas,我有一个数据集,看起来与我在下面粘贴的数据集相似。我需要做的是根据Group_no列中的值填充Group列中所有缺失的值。例如,如果Group_no为1,则Group的所有值都应为“Crops” 我试过几件事,最近的一个案例是,当我认为这个陈述会起作用,但失败了。我尝试了if/else,但是有200000条记录和8000个不同的组,我不知道如何在不逐个更新每条记录的情况下进行此操作。我已经用这个旋转我的轮子有一段时间了,我想一双新的眼睛可能会有所帮助 当我运行下面的代码时,得到的错误是 错误:子

我有一个数据集,看起来与我在下面粘贴的数据集相似。我需要做的是根据Group_no列中的值填充Group列中所有缺失的值。例如,如果Group_no为1,则Group的所有值都应为“Crops”

我试过几件事,最近的一个案例是,当我认为这个陈述会起作用,但失败了。我尝试了if/else,但是有200000条记录和8000个不同的组,我不知道如何在不逐个更新每条记录的情况下进行此操作。我已经用这个旋转我的轮子有一段时间了,我想一双新的眼睛可能会有所帮助

当我运行下面的代码时,得到的错误是

错误:子查询计算到多行

我是在SAS中使用Proc SQL完成这项工作的,因此,如果您有一个更简单的方法使用数据步骤,那么也欢迎您这样做

proc sql;
select 
a.ID
, a.Group
, a.Industry
, a.Group_no
,CASE WHEN a.Group IN (' ') THEN (select first(b.group) from mydata as b where first(a.Group_no) = first(b.Group_no)) END AS group_desc2
from mydata as a;
quit;
有两种方式:

方式1。

组\u no
降序组
对其进行排序,并用正确的组值填充缺少的值

对于每个组号,将组名存储在我们创建的名为
\u group
的临时变量中,该变量将一直携带到下一个组号<代码>\u group将始终保留当前组号的名称,并允许您根据需要填写。由于我们已按降序组对数据集进行了排序,因此有效的组名将始终是组号中的第一个观察值(除非它们都丢失)

方式2。

创建所有未丢失的组号/组名的格式

这将使用一种格式将组号与组名相关联。您可以使用SQL创建专门用于读取
proc format
的格式数据集。下面的SQL语句选择所有不同的非缺失组号,并为您提供非缺失组号和组名的格式数据集。这用于创建名为
$groupfmt的自定义格式。
这有效地充当查找表

proc sql noprint;
    create table group_fmt as
        select distinct 
            group_no   as start
          , group_no   as end
          , group      as label
          , 'C'        as type
          , 'groupfmt' as fmtname
        from have
        where NOT missing(group)
        ;
quit;

proc format cntlin=group_fmt;
run;

data want;
    set have;

    if(missing(group)) then group = put(group_no, $groupfmt.);
run;
put(组号,$groupfmt。)
也可以用于SQL查询而不是数据步骤。

有两种方法:

方式1。

组\u no
降序组
对其进行排序,并用正确的组值填充缺少的值

对于每个组号,将组名存储在我们创建的名为
\u group
的临时变量中,该变量将一直携带到下一个组号<代码>\u group将始终保留当前组号的名称,并允许您根据需要填写。由于我们已按降序组对数据集进行了排序,因此有效的组名将始终是组号中的第一个观察值(除非它们都丢失)

方式2。

创建所有未丢失的组号/组名的格式

这将使用一种格式将组号与组名相关联。您可以使用SQL创建专门用于读取
proc format
的格式数据集。下面的SQL语句选择所有不同的非缺失组号,并为您提供非缺失组号和组名的格式数据集。这用于创建名为
$groupfmt的自定义格式。
这有效地充当查找表

proc sql noprint;
    create table group_fmt as
        select distinct 
            group_no   as start
          , group_no   as end
          , group      as label
          , 'C'        as type
          , 'groupfmt' as fmtname
        from have
        where NOT missing(group)
        ;
quit;

proc format cntlin=group_fmt;
run;

data want;
    set have;

    if(missing(group)) then group = put(group_no, $groupfmt.);
run;
put(组号,$groupfmt。)
也可以用于SQL查询而不是数据步骤。

SQL

相关子查询导致
错误:
,因为它有多行:

, CASE 
    WHEN a.Group IN (' ') 
    THEN (select first(b.group) from mydata as b where first(a.Group_no) = first(b.Group_no)) 
  END AS group_desc2
将子查询更改为返回单行的查询。比如:

, case 
    when not missing(group) then group
    else (select min(group) from have as inner where inner.group_no = outer.group_no)
  end
  as group
重要的SAS SQL提醒:

  • 缺少的值被视为空值
  • 聚合函数仅对非空值进行操作
  • 在外部作用域中赋值时,空的相关子查询(即无行)被强制为空值
数据问题

  • 根据@Reeza,使用行业标准查找表可能比使用“自找”查找值更好
  • 关于自我发现,
    • 组的
      行中的
      值丢失时,会发生什么情况
    • 当“组”在
      group\u NO
      group中具有多个值时,会发生什么情况
数据步骤

佩尔@Stu Sztukowski

  • 如果在
    第一个位置,则路径1将不会显示为执行任何操作。组编号
    缺少
    值(即
    '
  • 方式2可能导致
    错误:当
    组中出现多个
    值时,此范围会重复…
数据步进方式#3

使用DOW循环捕获第一个未丢失的
值,然后根据需要应用后续串行循环


data want(drop=_:);
  length _first_group $20.;

  * data is pre-sorted by `group_no`;
  do _n_ = 1 by 1 until (last.group_no);
    set have;
    by group_no;
    if missing(_first_group) then
      _first_group = group;
  end;

  do _n_ = 1 to _n_;
    set have;
    if missing (group) then group=_first_group;
    output;
  end;
run;
SQL

相关子查询导致
错误:
,因为它有多行:

, CASE 
    WHEN a.Group IN (' ') 
    THEN (select first(b.group) from mydata as b where first(a.Group_no) = first(b.Group_no)) 
  END AS group_desc2
将子查询更改为返回单行的查询。比如:

, case 
    when not missing(group) then group
    else (select min(group) from have as inner where inner.group_no = outer.group_no)
  end
  as group
重要的SAS SQL提醒:

  • 缺少的值被视为空值
  • 聚合函数仅对非空值进行操作
  • 在外部作用域中赋值时,空的相关子查询(即无行)被强制为空值
数据问题

  • 根据@Reeza,使用行业标准查找表可能比使用“自找”查找值更好
  • 关于自我发现,
    • 组的
      行中的
      值丢失时,会发生什么情况
    • 当“组”在
      group\u NO
      group中具有多个值时,会发生什么情况
数据步骤

佩尔@Stu Sztukowski