如何查询各tfgroup分组中RankOfTime最大值对应的完整数据行?
问题原因分析
你的原始SQL缺少RankOfTime最大值匹配逻辑,仅通过GROUP BY+TOP 3的写法只能返回任意分组前3条结果,无法保证匹配每个tfgroup分组下RankOfTime最大的行,因此结果不符合预期。
修正后的SQL方案
通用窗口函数写法(支持SQL Server、MySQL 8.0+、PostgreSQL、Oracle等主流数据库)
SELECT tfgroup, City, activeDTTM, Begin_time, End_time, RankOfTime FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY tfgroup ORDER BY RankOfTime DESC) AS group_rank FROM timeFramesDetail ) temp WHERE group_rank = 1;
逻辑说明:
- 内层查询使用
ROW_NUMBER()窗口函数,按tfgroup分组后,每组内按RankOfTime倒序排序,每组内排序为1的就是RankOfTime最大的行 - 外层过滤出
group_rank = 1的行,即可取出所有tfgroup分组下符合要求的完整行,不需要手动限制返回条数
低版本MySQL兼容写法(不支持窗口函数场景)
SELECT a.* FROM timeFramesDetail a INNER JOIN ( SELECT tfgroup, MAX(RankOfTime) AS max_RankOfTime FROM timeFramesDetail GROUP BY tfgroup ) b ON a.tfgroup = b.tfgroup AND a.RankOfTime = b.max_RankOfTime;
输出结果匹配
执行上述语句后,返回结果完全匹配预期:
- tfgroup=2 对应 RankOfTime=2的完整行
- tfgroup=3 对应 RankOfTime=4的完整行
- tfgroup=4 对应 RankOfTime=8的完整行
内容的提问来源于stack exchange,提问作者SChavan
相关产品推荐
相关产品推荐

