Sql server SQL或SAS函数根据其他类似记录输入分类变量
我有一个数据集,看起来与我在下面粘贴的数据集相似。我需要做的是根据Group_no列中的值填充Group列中所有缺失的值。例如,如果Group_no为1,则Group的所有值都应为“Crops” 我试过几件事,最近的一个案例是,当我认为这个陈述会起作用,但失败了。我尝试了if/else,但是有200000条记录和8000个不同的组,我不知道如何在不逐个更新每条记录的情况下进行此操作。我已经用这个旋转我的轮子有一段时间了,我想一双新的眼睛可能会有所帮助 当我运行下面的代码时,得到的错误是 错误:子查询计算到多行 我是在SAS中使用Proc SQL完成这项工作的,因此,如果您有一个更简单的方法使用数据步骤,那么也欢迎您这样做Sql server SQL或SAS函数根据其他类似记录输入分类变量,sql-server,sas,Sql Server,Sas,我有一个数据集,看起来与我在下面粘贴的数据集相似。我需要做的是根据Group_no列中的值填充Group列中所有缺失的值。例如,如果Group_no为1,则Group的所有值都应为“Crops” 我试过几件事,最近的一个案例是,当我认为这个陈述会起作用,但失败了。我尝试了if/else,但是有200000条记录和8000个不同的组,我不知道如何在不逐个更新每条记录的情况下进行此操作。我已经用这个旋转我的轮子有一段时间了,我想一双新的眼睛可能会有所帮助 当我运行下面的代码时,得到的错误是 错误:子
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中具有多个值时,会发生什么情况group\u NO
- 当
- 如果在
第一个位置,则路径1将不会显示为执行任何操作。组编号
缺少
值(即组
)'
- 方式2可能导致
错误:当
组中出现多个
值时,此范围会重复…
组
值,然后根据需要应用后续串行循环
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中具有多个值时,会发生什么情况group\u NO
- 当