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

2亿条记录SAS数据集月度唯一账户数高效统计方法问询

高效统计SAS大数据集每月唯一账户数的方法

你有一个包含2022年数据的SAS数据集,字段包括ID(账户ID)、Date(日期)、Amount(金额),共2亿条记录,数据样例如下:

ID       Date         Amount
101      1/31/2022      50
102      1/31/2022      100
101      2/28/2022      25
...

当前使用的Proc SQL语句因数据量过大,运行耗时超1小时:

proc sql;
  create table unique as select distinct 
  date,
  count(distinct id) as uniqid
  from Have
  group by date
quit;

以下是几种更高效的替代实现方法:

方法一:先去重再统计(适合内存有限场景)

先通过排序去重保留Date和ID的唯一组合,再用PROC FREQ统计分组数量,避免SQL中count(distinct)的低效计算:

/* 1. 按日期+账户ID去重,生成无重复的临时数据集 */
proc sort data=Have nodupkey out=Have_nodup;
    by Date ID;
run;

/* 2. 按日期统计唯一账户数 */
proc freq data=Have_nodup noprint;
    tables Date / out=Unique_Counts(keep=Date Count rename=(Count=UniqID));
run;

nodupkey参数会直接剔除BY组内的重复项,比SQL的distinct更高效;PROC FREQ在分组计数上的性能优于Proc SQL,尤其适合大数据集。

方法二:哈希表内存统计(速度最快,需足够内存)

利用SAS哈希表在内存中直接处理去重和计数,避免磁盘IO开销,只要内存能容纳单月最大唯一账户数,速度会远超其他方法:

data Unique_Counts;
    if _N_ = 1 then do;
        declare hash h();
        h.defineKey('ID'); /* 用ID作为哈希表键,自动去重 */
        h.defineDone();
    end;

    do until(last.Date);
        set Have;
        by Date; /* 按日期分组处理 */
        h.add(); /* 将当前ID加入哈希表,重复ID会自动忽略 */
    end;

    UniqID = h.num_items; /* 获取当前日期的唯一账户数量 */
    output;
    h.clear(); /* 清空哈希表,准备下一个日期的统计 */
    keep Date UniqID;
run;

方法三:使用PROC SUMMARY高效聚合

PROC SUMMARY是SAS专为聚合统计设计的工具,内部优化比Proc SQL更充分,直接计算分组内的唯一值数量:

proc summary data=Have nway missing;
    class Date; /* 按日期分组 */
    output out=Unique_Counts(keep=Date UniqID) nid(distinct)=UniqID;
run;

nid(distinct)选项会直接统计每个Date分组下的唯一ID数量,无需额外去重步骤。

额外优化建议

  • 预处理数据集:只保留Date和ID字段,减少数据处理量:
    data Have_light;
        set Have;
        keep Date ID;
    run;
    
  • 确保Date字段已排序:如果原数据集未按Date排序,提前排序能减少后续分组操作的开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:00:25