使用PROC SQL提取延误次数最少的出发机场异常问题排查
解决SAS Proc SQL计算最少延误次数机场的问题
看起来你在统计各机场延误次数时遇到了逻辑偏差,导致所有机场返回了相同的结果,我来帮你梳理问题并修正代码:
问题根源
你的代码存在两个关键错误:
- 字段名不匹配:原数据集里的延误字段是
Dep_delay_min,但你写的是Departure_delay_minutes,这会导致子查询无法正确筛选出延误记录; - 子查询缺少分组逻辑:子查询里没有
Group by Origin,所以Count(...)统计的是所有机场延误记录的总和,而非每个机场各自的延误次数,最终外层查询拿到的每个机场对应的都是同一个总和值; - 额外小问题:原数据集名是
Flights,你写的是Flight(少了字母s),这会导致SAS找不到目标表。
修正后的代码
分步实现(更易理解)
Proc sql; /* 第一步:先统计每个机场的延误次数 */ Create table airport_delay_counts as Select Origin, Count(*) as Number_of_delays from Flights Where Dep_delay_min > 0 /* 仅统计延误(延误分钟数为正)的记录 */ Group by Origin; /* 按机场分组计算 */ /* 第二步:筛选出延误次数最少的机场 */ Create table least_delay as Select Origin, Number_of_delays as min_delay from airport_delay_counts Where Number_of_delays = (Select min(Number_of_delays) from airport_delay_counts); Quit;
合并为单条SQL语句(更简洁)
Proc sql; Create table least_delay as Select Origin, Number_of_delays as min_delay from ( Select Origin, Count(*) as Number_of_delays from Flights Where Dep_delay_min > 0 Group by Origin ) as delay_counts Where Number_of_delays = (Select min(Number_of_delays) from delay_counts); Quit;
针对你的样本数据验证
手动统计样本里各机场的延误次数:
- EWR:仅1条延误记录(
Dep_delay_min=1) - LGA:仅1条延误记录(
Dep_delay_min=8) - JFK:共4条延误记录(
Dep_delay_min=6、3条Dep_delay_min=42)
运行修正后的代码后,least_delay表会返回EWR和LGA,它们的延误次数均为1,是样本中最少的。
内容的提问来源于stack exchange,提问作者Aman kashyap
相关产品推荐
相关产品推荐

