SQL不使用MAX()函数如何按标识符分组取每组COLUMN_B最大的记录
禁用MAX函数时按Column_A分组取Column_B最大值的实现方案
方案1:自左连接反查法(兼容性最好,支持绝大多数SQL数据库)
SELECT t1.COLUMN_A, t1.COLUMN_B FROM your_table t1 LEFT JOIN your_table t2 ON t1.COLUMN_A = t2.COLUMN_A AND t1.COLUMN_B < t2.COLUMN_B WHERE t2.COLUMN_A IS NULL;
逻辑说明:将表和自身做关联,关联条件是同Column_A分组下,t2的Column_B值大于t1的Column_B值。如果某条t1记录没有匹配到对应的t2记录,说明该分组下没有比当前t1.Column_B更大的值,这条就是分组内的最大值记录。
方案2:窗口函数法(支持窗口函数的数据库可使用,逻辑更清晰)
SELECT COLUMN_A, COLUMN_B FROM ( SELECT COLUMN_A, COLUMN_B, ROW_NUMBER() OVER (PARTITION BY COLUMN_A ORDER BY COLUMN_B DESC) AS rn FROM your_table ) t WHERE rn = 1;
逻辑说明:用ROW_NUMBER窗口函数对同一Column_A分组的记录按Column_B降序排序,排序后序号为1的就是分组内Column_B最大的记录。如果需要保留同分组内并列最大值的所有记录,把ROW_NUMBER替换为RANK即可。
方案3:ALL运算符法
SELECT COLUMN_A, COLUMN_B FROM your_table t1 WHERE COLUMN_B >= ALL ( SELECT COLUMN_B FROM your_table t2 WHERE t2.COLUMN_A = t1.COLUMN_A );
逻辑说明:筛选出满足「当前Column_B大于等于同Column_A分组下所有Column_B值」的记录,即为分组最大值记录。
注意事项
- 以上代码中的
your_table请替换为你实际使用的表名。 - 如果同一Column_A分组下存在多条Column_B同为最大值的记录,方案1和方案3会返回所有符合条件的记录,可根据实际需求增加去重逻辑调整。
内容的提问来源于stack exchange,提问作者wltay04
相关产品推荐
相关产品推荐

