如何在PROC SQL语句中实现分组后组内日期升序排序
PROC SQL按ID分组并实现组内申请日期升序的实现方法
首先明确核心逻辑:如果不需要做分组聚合计算(比如计数、求最值),不需要写GROUP BY子句,直接用ORDER BY指定排序字段顺序,就能同时实现同ID记录归集、组内日期升序的效果。
- 基础场景:仅需将同ID记录归为一组,组内申请日期从早到晚排序,直接用以下写法即可:
PROC SQL; SELECT * FROM 你的输入数据集名称 /* 排序优先级:先按ID升序归集,相同ID下按申请日期升序排列 */ ORDER BY ID, 申请日期; QUIT;
ORDER BY默认排序规则就是升序,不需要额外加ASC关键字,执行后同ID的所有记录会连续展示,且每个ID对应的申请日期自动按从早到晚排列。
- 聚合统计场景:需要按ID分组做聚合计算(比如统计每个ID的最早申请日期、申请总次数),此时需要搭配
GROUP BY,最后用ORDER BY保证输出顺序:
PROC SQL; SELECT ID, MIN(申请日期) AS 最早申请日期 format=date9., COUNT(*) AS 申请总次数 FROM 你的输入数据集名称 GROUP BY ID ORDER BY ID, 最早申请日期; QUIT;
- 明细带序号场景:需要保留所有明细记录,同时给每个ID下的申请日期生成组内排序序号(标记第1次、第2次申请),可以用关联子查询实现:
PROC SQL; CREATE TABLE 排序后带序号的数据集 AS SELECT a.*, b.申请序号 FROM 你的输入数据集名称 a LEFT JOIN ( SELECT ID, 申请日期, COUNT(*) AS 申请序号 FROM 你的输入数据集名称 GROUP BY ID, 申请日期 ) b ON a.ID = b.ID AND a.申请日期 = b.申请日期 ORDER BY a.ID, a.申请日期; QUIT;
注意事项:如果你的申请日期字段是字符类型存储,必须先转成SAS数值型日期再排序,否则会按照字符字典序排列,出现"10月记录排在2月前面"的错误,转换参考写法:
INPUT(字符型申请日期, YYMMDD10.) AS 申请日期 format=date9.,根据你实际的字符日期格式调整输入格式参数即可。
内容的提问来源于stack exchange,提问作者GrammarHippo
相关产品推荐
相关产品推荐

