Sql 所选变量的平均值(SAS)

Sql 所选变量的平均值(SAS),sql,statistics,sas,analytics,Sql,Statistics,Sas,Analytics,对于expamle,我有一个包含两个变量的表a,第一个变量是客户id,第二个变量是客户收入,范围为100到200美元。任务是创建一个表B,其中我将有平均收入150美元的客户,客户数量应最大。换句话说,我需要表B中有表A中最大数量的客户,表B中客户的平均收入应该正好等于150。使用SAS Enterprise Guide有什么优雅的方法吗?贪婪算法可能会很好地完成这项工作,这取决于数据的结构。这当然不能保证是最优的,但可以相对快速地实现 这个想法是: 计算所有记录的平均值 如果平均价格是150美元

对于expamle,我有一个包含两个变量的表a,第一个变量是客户id,第二个变量是客户收入,范围为100到200美元。任务是创建一个表B,其中我将有平均收入150美元的客户,客户数量应最大。换句话说,我需要表B中有表A中最大数量的客户,表B中客户的平均收入应该正好等于150。使用SAS Enterprise Guide有什么优雅的方法吗?

贪婪算法可能会很好地完成这项工作,这取决于数据的结构。这当然不能保证是最优的,但可以相对快速地实现

这个想法是:

  • 计算所有记录的平均值
  • 如果平均价格是150美元,那么停下来
  • 删除最大/最小值以增加或减少平均值(视情况而定)
  • 如果平均价格是150美元,那么停下来
  • 重复(1)直到完成
  • 如果值集中在150美元左右,这应该可以很好地工作。如果它们分布广泛,那么您可能无法在最终的垃圾箱中获得任何记录


    如果该算法适用于您的数据,那么可能会有更快的实现方法。

    按收入从低到高对记录进行排序。然后计算所有记录1-N的平均值。找到N,其中平均值=150

    data test;
    do id = 1 to 1000;
    income = 100 + round(ranuni(1)*100,1);
    output;
    end;
    run;
    
    proc sort data=test;
    by income;
    run;
    
    data want(where=(ave<=150));
    set test;
    
    retain sum 0;
    
    sum = sum + income;
    ave = sum / _n_;
    
    drop sum;
    run;
    
    数据测试;
    do id=1至1000;
    收入=100+轮(拉努尼(1)*100,1);
    产出;
    结束;
    跑
    proc排序数据=测试;
    按收入计算;
    跑
    
    我不认为有一种优雅的方法可以得到这样一个最大子集。如果有,我也很好奇。