SQL查询:获取各INTERNSHIP ID最新Term对应的Term Description
解决方案:获取每个实习生ID的最新Term及对应描述
首先先明确你的表结构(我把你给出的代码块转换成更清晰的表格形式):
INTERNSHIP表
| INTERNSHIP ID | Term |
|---|---|
| 1 | 2015 |
| 1 | 2014 |
| 2 | 2016 |
| 2 | 2017 |
Term表
| Term | Term Description | End Date |
|---|---|---|
| 2014 | Summer 2014 | 8/1/2014 |
| 2014 | Summer 2014 | 8/1/2014 |
| 2015 | Fall 2015 | 12/1/2015 |
| 2017 | Spring 2017 | 4/1/2017 |
| 2017 | Spring 2017 | 6/1/2017 |
你的需求是找到每个ID对应的最新Term,并关联Term表拿到对应的Term Description,你之前的SQL只完成了第一步,没关联Term表,而且子查询的写法也有问题(没有按ID分组取最大Term,会拿到全局最大Term)。下面给你两种可行的解决方案:
方法1:子查询+关联表(兼容大多数数据库)
这种方法先通过子查询获取每个ID的最新Term,再回连原表和Term表拿到描述,同时处理Term表的重复行:
SELECT i.`INTERNSHIP ID` AS ID, i.Term, t.`Term Description` FROM INTERNSHIP i -- 关联子查询拿到每个ID的最新Term JOIN ( SELECT `INTERNSHIP ID`, MAX(Term) AS LatestTerm FROM INTERNSHIP GROUP BY `INTERNSHIP ID` ) latest ON i.`INTERNSHIP ID` = latest.`INTERNSHIP ID` AND i.Term = latest.LatestTerm -- 关联去重后的Term表(因为Term表有重复的Term-描述组合) JOIN ( SELECT DISTINCT Term, `Term Description` FROM Term ) t ON i.Term = t.Term;
方法2:窗口函数(适合支持窗口函数的数据库,如MySQL 8+、PostgreSQL、SQL Server等)
这种方法更简洁,用ROW_NUMBER()窗口函数给每个ID的Term按降序排名,取排名第一的就是最新的记录:
SELECT ID, Term, `Term Description` FROM ( SELECT i.`INTERNSHIP ID` AS ID, i.Term, t.`Term Description`, -- 按ID分组,Term降序排序,第一行就是最新Term ROW_NUMBER() OVER (PARTITION BY i.`INTERNSHIP ID` ORDER BY i.Term DESC) AS rn FROM INTERNSHIP i JOIN Term t ON i.Term = t.Term ) ranked WHERE rn = 1;
为什么你的原SQL不行?
你原来的SQL中,子查询SELECT MAX(INTERNSHIP.Term)没有和外层的ID关联,会返回整个INTERNSHIP表的最大Term(也就是2017),而不是每个ID自己的最大Term。而且你没有和Term表做JOIN,自然拿不到Term Description。
内容的提问来源于stack exchange,提问作者Di Tran
相关产品推荐
相关产品推荐

