如何用SAS Proc SQL查询SQL Server表中各案例的最新记录
用SAS Proc SQL从SQL Server提取每个案例的最新记录
这里有两种无需创建临时表的可行方案,适配无写入权限的场景:
方案1:窗口函数ROW_NUMBER()(推荐)
这是最高效简洁的方式,SQL Server原生支持窗口函数,Proc SQL可以直接通过ODBC调用该逻辑:
proc sql; connect to odbc (dsn='你的SQL Server数据源名称'); select * from connection to odbc ( SELECT t.* FROM ( SELECT *, -- 按案例字段分组,每组内按最后更新日期倒序编号 ROW_NUMBER() OVER (PARTITION BY 案例标识字段 ORDER BY 最后更新日期 DESC) AS row_num FROM 你的事务数据表名 ) t -- 只取每组的第一条(最新记录) WHERE t.row_num = 1 ); disconnect from odbc; quit;
- 把
案例标识字段替换成你实际用来区分不同案例的字段(比如case_id) - 如果同一个案例在同一时间有多条记录,可在
ORDER BY后加额外字段(比如主键)确保唯一取一条:ORDER BY 最后更新日期 DESC, 主键字段 DESC
方案2:关联子查询(兼容旧环境)
如果环境不支持窗口函数,用子查询先获取每个案例的最新日期,再关联原表匹配记录:
proc sql; connect to odbc (dsn='你的SQL Server数据源名称'); select * from connection to odbc ( SELECT t1.* FROM 你的事务数据表名 t1 INNER JOIN ( -- 先分组得到每个案例的最大更新日期 SELECT 案例标识字段, MAX(最后更新日期) AS latest_date FROM 你的事务数据表名 GROUP BY 案例标识字段 ) t2 ON t1.案例标识字段 = t2.案例标识字段 AND t1.最后更新日期 = t2.latest_date ); disconnect from odbc; quit;
注意:如果同一案例同一日期有多条记录,这个方案会返回所有符合的记录,可根据需求调整。
为什么你之前的方法没用?
直接用MAX(最后更新日期)搭配HAVING的问题在于:HAVING是对分组后的聚合结果过滤,无法关联回原表的其他字段,所以只能拿到日期值,拿不到对应案例的完整记录。
内容的提问来源于stack exchange,提问作者Elliott
相关产品推荐
相关产品推荐

