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

如何用PROC SQL获取列首行?解决SAS分组取指定球员问题

解决方案:SAS分组筛选最高薪球员及首行数据获取

一、棒球数据集需求的正确实现

原脚本的核心问题是误用了SAS的first()函数——这个函数是字符串处理函数,仅返回字符串的第一个字符,并非分组取首行的聚合工具。要实现「每个球队筛选出至少30次助攻的球员中的最高薪者」,可以用以下两种方法:

方法1:PROC SQL实现(窗口函数版)

利用窗口函数直接对分组后的薪资排序,取排名第一的记录:

proc sql;
create table basketball_summary as
    select distinct team, salary, Name
    from (
        select team, salary, Name,
               -- 按球队分组,薪资降序排名,相同薪资会并列第一
               rank() over (partition by team order by salary desc) as salary_rank
        from sashelp.baseball
        where nAssts >= 30
    )
    where salary_rank = 1
    order by team;
quit;

如果要求同一球队有相同最高薪时仅保留1条,将rank()替换为row_number()即可。

方法2:DATA步实现

通过排序+分组判断的方式,直接取每组符合条件的第一条记录:

-- 先按球队分组,薪资降序排序
proc sort data=sashelp.baseball out=baseball_sorted;
    by team descending salary;
run;

-- 取每组第一个符合助攻条件的记录(即最高薪者)
data basketball_summary;
    set baseball_sorted;
    by team;
    if first.team and nAssts >= 30 then output;
run;

二、PROC SQL获取分组后某列的首行数据

如果需要通用的「分组后取某列首行数据」功能,可通过以下两种方式实现:

方法1:窗口函数row_number()

指定排序规则后,取每组的第一条记录:

proc sql;
create table first_row_per_group as
    select group_col, target_col
    from (
        select group_col, target_col,
               row_number() over (partition by group_col order by sort_col) as rn
        from your_dataset
    )
    where rn = 1;
quit;

其中group_col是分组列,sort_col是用来确定首行顺序的列,target_col是要提取首行的目标列。

方法2:子查询关联

通过找到分组内排序列的极值来定位首行:

proc sql;
create table first_row_per_group as
    select a.group_col, a.target_col
    from your_dataset a
    where a.sort_col = (select min(sort_col) from your_dataset where group_col = a.group_col)
    group by a.group_col, a.target_col;
quit;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:22:52