如何用SQL从Term和Year字段计算并查询学年数据?
按学年高效查询的SQL与R实现方案
SQL 高效查询方案
针对多学年查询,无需编写重复的OR条件,可通过学年起始年的逻辑统一筛选:
- Fall学期的学年起始年等于当前Year
- Spring/Summer学期的学年起始年等于当前Year减1
写法1:生成学年起始年字段(便于查看与后续分析)
SELECT *, -- 计算每条记录对应的学年起始年 CASE WHEN TERM = 'Fall' THEN Year ELSE CAST(CAST(Year AS INT) - 1 AS VARCHAR(4)) END AS academic_year_start FROM DTA_Set1 -- 筛选目标学年的起始年,比如AY2021-22(2021)、AY2022-23(2022) WHERE academic_year_start IN ('2021', '2022');
写法2:直接在WHERE子句中判断(更简洁)
SELECT * FROM DTA_Set1 WHERE -- Fall学期匹配目标起始年 (TERM = 'Fall' AND Year IN ('2021', '2022')) OR -- Spring/Summer学期匹配「当前年份-1」的目标起始年 (TERM IN ('Spring', 'Summer') AND CAST(Year AS INT) - 1 IN (2021, 2022));
只需修改IN中的值,即可快速切换或添加多个目标学年,无需重复编写OR分支。
R 数据筛选方案
针对你的示例数据Sam_Data,先统一学期名称的大小写(避免匹配误差),再用相同的学年逻辑筛选:
步骤1:统一学期格式并生成学年起始年
# 统一TERM为大写,避免大小写不一致导致的判断错误 Sam_Data$TERM <- toupper(Sam_Data$TERM) # 计算每条记录的学年起始年 Sam_Data$academic_year_start <- ifelse( Sam_Data$TERM == "FALL", Sam_Data$Year, as.character(as.integer(Sam_Data$Year) - 1) ) # 筛选目标学年(比如AY2016-17、AY2017-18) target_start_years <- c("2016", "2017") filtered_data <- Sam_Data[Sam_Data$academic_year_start %in% target_start_years, ]
步骤2:直接筛选(无需生成额外字段)
如果不需要保留学年起始年字段,可直接在索引中完成判断:
Sam_Data$TERM <- toupper(Sam_Data$TERM) target_start_years <- c(2016, 2017) filtered_data <- Sam_Data[ (Sam_Data$TERM == "FALL" & as.integer(Sam_Data$Year) %in% target_start_years) | (Sam_Data$TERM %in% c("SPRING", "SUMMER") & (as.integer(Sam_Data$Year)-1) %in% target_start_years), ]
内容的提问来源于stack exchange,提问作者asokol
相关产品推荐
相关产品推荐

