如何查找表中与行关联的最大INT值?含示例及错误尝试
解决表中按键关联获取最高speed对应行的问题
嘿,我懂你碰到的麻烦了——当你想拿到每个键对应的最高speed那一行数据时,直接用MAX()搭配GROUP BY很容易踩坑:数据库只会保证聚合函数(比如MAX(speed))的结果是对的,但其他非聚合列(比如你的键关联的其他字段)可能会随机返回某一行的值,导致出现“speed是最高的,但对应键不对”的情况。
下面给你几种靠谱的解决方案,适配不同的数据库场景:
方法1:用窗口函数(推荐,现代数据库首选)
如果你的数据库支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server、Oracle),用ROW_NUMBER()是最清晰的方式:
SELECT key_column, speed, other_columns FROM ( SELECT key_column, speed, other_columns, -- 按key分组,每组内按speed降序排序,给最高speed的行标1 ROW_NUMBER() OVER (PARTITION BY key_column ORDER BY speed DESC) AS row_rank FROM table_a ) ranked_data WHERE row_rank = 1;
- 说明:
PARTITION BY key_column会把数据按你的键分成一个个小组,ORDER BY speed DESC让每组里speed最高的行排在最前面,ROW_NUMBER()给它标记为1,最后筛选出标记为1的行就是你要的。 - 小补充:如果存在多个行speed并列最高的情况,
ROW_NUMBER()会随机选一个;要是想保留所有并列的最高speed行,把ROW_NUMBER()换成RANK()或者DENSE_RANK()就行。
方法2:子查询+关联(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以先找出每个键对应的最高speed,再和原表关联匹配:
SELECT ta.key_column, ta.speed, ta.other_columns FROM table_a ta INNER JOIN ( -- 先拿到每个key对应的最大speed SELECT key_column, MAX(speed) AS max_speed FROM table_a GROUP BY key_column ) max_speed_data ON ta.key_column = max_speed_data.key_column AND ta.speed = max_speed_data.max_speed;
- 说明:子查询先算出每个键的最高speed,然后通过
key_column和speed两个条件关联原表,这样就能拿到对应最高speed的整行数据。如果有多个行speed并列最高,这个方法会返回所有符合条件的行。
为什么你之前的尝试会出错?
大概率你之前的代码是类似这样的:
SELECT key_column, MAX(speed) AS max_speed, other_columns FROM table_a GROUP BY key_column;
这种写法在某些数据库的宽松模式下能运行,但other_columns并没有和key_column形成函数依赖,数据库会从分组里随机选一行的other_columns值,这就导致了“speed是最高的,但对应键的其他字段不对”的问题。
内容的提问来源于stack exchange,提问作者user9314692
相关产品推荐
相关产品推荐

