SQL查询:无需JOIN获取各唯一col1对应的最大col2行(百万级表)
无需JOIN实现获取每个col1最大col2对应的行
针对你这个需求,不用JOIN的话,窗口函数是非常高效的解决方案,尤其适配百万级别的数据量——现代数据库对这类函数的优化做得相当到位,不会带来额外的性能负担。
核心思路很简单:给每个col1分组内的行按col2降序排名,然后筛选出排名第一的行,就能直接拿到每个col1对应最大col2的那条完整记录。
具体SQL代码
SELECT col1, col2, col3 FROM ( SELECT col1, col2, col3, ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col2 DESC) AS rn FROM your_table ) t WHERE rn = 1 ORDER BY col1;
代码细节说明
PARTITION BY col1:把整张表的数据按col1拆分成分组,每个分组独立处理ORDER BY col2 DESC:在每个分组内部,按col2从大到小排序,这样最大的col2值会排在分组的第一位ROW_NUMBER():给每个分组内的行分配唯一的排名序号,最大col2对应的行序号为1- 外层查询只保留序号为1的行,最后按col1排序就完全匹配你想要的结果
要是你的业务场景里存在同一个col1对应多个相同最大col2值的情况,可以把ROW_NUMBER()替换成RANK(),这样会保留所有col2等于最大值的行;不过从你的示例数据来看,每个col1只有一个最大col2的行,所以ROW_NUMBER()更贴合需求。
这个方案全程不需要JOIN操作,避免了关联查询可能带来的性能损耗,只要你在col1和col2上建立合适的索引,百万级数据的执行速度会非常可观。
内容的提问来源于stack exchange,提问作者Aman Jain
相关产品推荐
相关产品推荐

