如何获取各分组集中Term列最大值对应的行?
获取分组内Term最大值对应的所有行
问题描述
现有如下结构的表格:
| Module_Name | Term | synopsis |
|---|---|---|
| Ali | 2001 | case1 |
| Ali | 2002 | case2 |
| Ali | 2002 | case3 |
| Nami | 2101 | Opt1 |
| Nami | 2101 | Opt2 |
| Nami | 2102 | opt3 |
需要按Module_Name分组,提取每个分组中Term列值最大的所有行,期望结果:
| Module_Name | Term | synopsis |
|---|---|---|
| Ali | 2002 | case2 |
| Ali | 2002 | case3 |
| Nami | 2102 | opt3 |
解决方案
方法1:子查询关联(通用SQL,适配多数数据库)
先通过子查询算出每个Module_Name对应的最大Term值,再将原表和这个子查询结果关联,筛选出符合条件的行:
SELECT t.* FROM your_table t INNER JOIN ( SELECT Module_Name, MAX(Term) AS max_term FROM your_table GROUP BY Module_Name ) m ON t.Module_Name = m.Module_Name AND t.Term = m.max_term;
方法2:窗口函数(支持窗口函数的数据库,如MySQL 8+/PostgreSQL/SQL Server等)
使用RANK()窗口函数,为每个分组内的行按Term降序排序,标记出Term最大的行,再筛选标记为1的行:
SELECT Module_Name, Term, synopsis FROM ( SELECT *, RANK() OVER (PARTITION BY Module_Name ORDER BY Term DESC) AS rnk FROM your_table ) t WHERE rnk = 1;
如果分组内有多个相同的最大Term值,RANK()会给它们都标记为1,正好匹配需求;若使用ROW_NUMBER()会给每行分配唯一序号,可能只取到其中一行,因此这里RANK()更合适。
方法3:MAX()窗口函数(直观写法)
直接在每行计算当前分组的最大Term,再筛选行的Term等于该最大值:
SELECT Module_Name, Term, synopsis FROM ( SELECT *, MAX(Term) OVER (PARTITION BY Module_Name) AS max_term FROM your_table ) t WHERE Term = max_term;
这种写法无需排序,逻辑更直观,部分场景下性能更优。
内容的提问来源于stack exchange,提问作者vivek ramasamy
相关产品推荐
相关产品推荐

