如何用SAS实现按ID分组后取最高金额对应order_type并汇总字段
SAS实现分组汇总并取最大值对应字段的方案
实现逻辑
按ID分组后需要完成两类计算:
- amt、no_of_order字段按组求和
- 同组内按amt降序排序,取第一行的order_type作为该组的取值
参考代码
方法1:PROC SQL实现(代码简洁易读,适合中小数据量)
/* 1. 构造测试数据集 */ data test; input ID amt order_type $ no_of_order; datalines; 1 200 em 6 1 300 on 5 2 600 em 10 ; run; /* 2. 核心计算 */ proc sql; create table output as select ID, sum(amt) as amt format=best12., (select order_type from test b where a.ID = b.ID having b.amt = max(b.amt)) as order_type $, sum(no_of_order) as no_of_order format=best12. from test a group by ID; quit;
方法2:Data步DoW循环实现(仅遍历一次数据,适合大数据量高性能场景)
data output2; length order_type $2; sum_amt = 0; sum_no = 0; max_amt = -1; do until(last.ID); set test; by ID; sum_amt + amt; sum_no + no_of_order; if amt > max_amt then do; max_amt = amt; order_type = order_type; end; end; amt = sum_amt; no_of_order = sum_no; keep ID amt order_type no_of_order; run;
两种方法运行后得到的结果均和给出的期望输出一致。
内容的提问来源于stack exchange,提问作者Alex Dunphy
相关产品推荐
相关产品推荐

