选择sas中字符长度最大的行
我有以下数据集:选择sas中字符长度最大的行,sas,proc-sql,Sas,Proc Sql,我有以下数据集: dataseta: No. Name1 Name2 Sales Inv Comp 1 TC Tribal Council Inc 100 100 0 2. TC Tribal Council Limited INC 20 25 65 desired output: datasetb: No. Name1 Name2 Sa
dataseta:
No. Name1 Name2 Sales Inv Comp
1 TC Tribal Council Inc 100 100 0
2. TC Tribal Council Limited INC 20 25 65
desired output:
datasetb:
No. Name1 Name2 Sales Inv Comp
1 TC Tribal Council Limited Inc 120 125 0
基本上,我需要为列名称2选择具有最大字符长度的行。
我尝试了以下方法,但没有成功
proc sql;
create table datasetb as select no,name1,name2,sum(sales),sum(inv),min(comp) from dataseta group by 1,2,3 having length(name2)=max(length(name2));quit;
如果我执行以下代码,它只会部分解析它,并且会得到重复的行
proc sql;
create table datasetb as select no,name1,max(length(name2)),sum(sales),sum(inv),min(comp) from dataseta group by 1,2 having length(name2)=max(length(name2));quit;
您似乎正在合并两个单独的聚合计算的结果 假定:
no
是唯一的,以允许一个平局打破标准,第一个(根据no
)最长的name2
将与成本
,inv
,comp
总计超过name1
查询将有很多正在进行
- 第一长
在name2
中,需要嵌套子查询:name1
- 确定最长的
,然后名称2
- 如果有多个,请根据
选择第一个no
- 确定最长的
- 总计超过
name1
- 总计将是一个子查询,该子查询将被连接到,以提供所需的结果集
name1
组是连续行时,以串行方式处理数据可以使用DOW循环技术来完成——这是一个包含SET
语句的循环
data want2;
do until (last.name1);
set have;
by name1 notsorted;
if length(name2) > longest then do;
longest = length(name2);
no_at_longest = no;
name2_at_longest = name2;
end;
sales_sum = sum(sales_sum,sales);
inv_sum = sum(inv_sum,inv);
comp_sum = sum(comp_sum,comp);
end;
drop name2 no sales inv comp longest;
rename
no_at_longest = no
name2_at_longest = name2
sales_sum = sales
inv_sum = inv
comp_sum = comp
;
run;
拥有长度(name2)=max(长度(name2))
这应该会给出你想要的结果在打领带的情况下你想做什么?@samkart我尝试了你的建议,但没有成功。我更新了我原来的帖子。基本上,它只解决了部分问题,我得到了副本rows@Tom如果是平局,就只有一排了。然而,就你的观点而言,我尝试了另一个人建议的方法,但我得到了重复的行。我们尝试解决方案的目的不仅仅是选择最长值为NAME2的观察值。另外,您在选择列表中派生新变量,而不告诉SAS这些派生变量的名称。如果两个或多个观测值都具有相同长度的NAME2值,您希望使用什么标准在它们之间进行选择?如果你有两个或两个以上相同的观察结果(以至于无法区分它们),该怎么办?
data want2;
do until (last.name1);
set have;
by name1 notsorted;
if length(name2) > longest then do;
longest = length(name2);
no_at_longest = no;
name2_at_longest = name2;
end;
sales_sum = sum(sales_sum,sales);
inv_sum = sum(inv_sum,inv);
comp_sum = sum(comp_sum,comp);
end;
drop name2 no sales inv comp longest;
rename
no_at_longest = no
name2_at_longest = name2
sales_sum = sales
inv_sum = inv
comp_sum = comp
;
run;