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

SAS Proc SQL程序持续运行不终止,提示需合并汇总统计与原始数据

SAS Proc SQL 运行终止失败与重合并提示问题解析

问题原因

  • 重合并提示的直接原因:你的查询使用了COUNT(*)和sum(InvoiceAmount)聚合函数,但注释掉了GROUP BY i1.UpdatedDate子句。Proc SQL在无GROUP BY时,会默认尝试将汇总结果与原始数据集逐行合并(即remerge),这不仅触发提示,还会导致计算逻辑混乱、效率暴跌。
  • 运行无法终止的核心原因:关联子查询(select count(*) from ... where i2.UpdatedDate < i1.UpdatedDate)是行相关子查询,每处理一行i1数据就要全表扫描一次i2表。若ASKIDAFATURA_INVOICES表数据量较大,这种嵌套查询会让计算量呈指数级增长,直接拖慢到程序无法完成。

优化后的代码

proc sql;
create table PUBLIC.ILK_ODENEN_SAYI as
select 
    datepart(UpdatedDate) as date format=date9.,
    count(*) as ILK_ODENEN_SAYI,
    sum(InvoiceAmount) as ILK_ODENEN_MIKTAR
from (
    select 
        CitizenIdentity,
        UpdatedDate,
        InvoiceAmount,
        row_number() over(partition by CitizenIdentity order by UpdatedDate) as rn
    from fatura.ASKIDAFATURA_INVOICES
    where Status=2 and CorparateIdentity in (1,2)
) t
where rn=1  /* 筛选每个CitizenIdentity的最早记录 */
group by datepart(UpdatedDate);  /* 按日期聚合 */
quit;

优化说明

  • 用窗口函数row_number()替代关联子查询:通过partition by CitizenIdentity order by UpdatedDate给每个公民的记录按更新日期排序,取第一条(rn=1)就是最早的那条,避免反复扫描全表。
  • 恢复GROUP BY子句:明确按日期分组聚合,彻底消除重合并提示,同时让聚合逻辑清晰,计算效率大幅提升。
  • 简化查询层级:去掉不必要的外层SELECT *,直接从子查询筛选后聚合,减少冗余计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:35:20