You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAS如何实现分组内基于近两季度数据计算AVG与STD

原代码问题定位
  • 原始数据存在同季度跨phase的乱序排布,用by type phase notsorted时,只要相邻记录的type+phase值不连续相同,就会判定为分组边界。比如AA-C 202003下先出现phase3的98,接着是phase1、phase2的记录,再回到phase3的48,系统会把同一个phase拆成两个独立分组,取数逻辑完全错位。
  • 数据没有按quarter字段排序,lag()是按数据步读取的物理记录顺序抓前值,不是自动按时间顺序匹配相邻季度,就算分组逻辑正确,取到的前序counter值也不是时序上最近的上一季度数据。
正确实现方法

1. 先做全局排序

按type、phase、quarter三个字段升序排序,把同一个type+phase下的所有记录严格按时间先后理顺,避免乱序导致的分组断裂:

proc sort data=have;
  by type phase quarter;
run;

2. 分组计算两期指标

排序完成后,BY语句不需要加notsorted选项,每个type+phase的连续记录就是完整的时序序列,直接用lag()抓紧邻前一条的counter值,到分组最后一条(也就是最新季度的记录)时触发均值和标准差计算:

data want;
  set have;
  by type phase;
  * 因已按quarter排序,lag()抓到的counter就是时序上紧邻的上一条记录值;
  prev_counter = lag(counter);
  * 到达每个type+phase分组的最后一条记录时计算指标;
  if last.phase then do;
    avg = mean(prev_counter, counter);
    std = std(prev_counter, counter);
    keep type phase avg std;
    output;
  end;
run;
结果匹配校验

运行后输出完全符合预期规则:

  • BB-B 1:最近两期counter为79、17,均值48
  • BB-B 2:最近两期counter为20、2,均值11
  • BB-B 3:最近两期counter为88、100,均值94
  • AA-C 1:最近两期counter为23、7,均值15
  • AA-C 2:最近两期counter为39、9,均值24
  • AA-C 3:最近两期counter为98、48,均值73

内容的提问来源于stack exchange,提问作者TangerCity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 12:27:03