选择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

    • 总计将是一个子查询,该子查询将被连接到,以提供所需的结果集
示例(SQL)

示例(数据步骤)

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;