按重复账户ID分组,选取最高Account_Occupant对应行的SQL查询求助
解决每个账户取最大Account_Occupant记录的SQL方案
嘿,我完全懂你现在的头疼点——要从几千条记录里给每个账户揪出Account_Occupant序号最大的那一行,还得带出对应的姓名对吧?直接用GROUP BY确实容易卡壳,因为GROUP BY要求非聚合列必须在分组条件里,可姓名没法直接和最大序号绑定在一起。下面给你几种靠谱的解决办法,适配不同的数据库环境:
方法1:用窗口函数(推荐,支持现代数据库)
这是最直观且不易出错的方式,MySQL 8+、PostgreSQL、SQL Server等主流数据库都支持:
WITH ranked_records AS ( SELECT Account_Number, Account_Occupant, Name, -- 按账户分组,每组内按Account_Occupant降序排,给每条记录编行号 ROW_NUMBER() OVER (PARTITION BY Account_Number ORDER BY Account_Occupant DESC) AS rn FROM your_table_name -- 替换成你的实际表名 ) SELECT Account_Number, Account_Occupant, Name FROM ranked_records WHERE rn = 1; -- 只取每组里行号为1的(也就是序号最大的那条)
如果遇到同一个账户有多个相同的最大序号,可以把ROW_NUMBER()换成RANK(),这样会返回所有并列最大的记录;如果只想取任意一条,ROW_NUMBER()就足够。
方法2:MAX子查询+JOIN(适配旧版数据库)
要是你的数据库不支持窗口函数(比如MySQL 5.x),可以用这种组合方式:
SELECT t.Account_Number, t.Account_Occupant, t.Name FROM your_table_name t INNER JOIN ( -- 先查出每个账户的最大Account_Occupant值 SELECT Account_Number, MAX(Account_Occupant) AS max_occupant FROM your_table_name GROUP BY Account_Number ) max_vals ON t.Account_Number = max_vals.Account_Number AND t.Account_Occupant = max_vals.max_occupant;
注意:如果同一个账户存在多个相同的最大序号,这个方法会返回多行,你可以根据业务需求加额外筛选条件。
方法3:关联子查询(写法简洁)
这种方式逻辑直白,适合快速验证:
SELECT Account_Number, Account_Occupant, Name FROM your_table_name t -- 对每条记录,判断它的Account_Occupant是否是所属账户的最大值 WHERE Account_Occupant = ( SELECT MAX(Account_Occupant) FROM your_table_name WHERE Account_Number = t.Account_Number );
同样,若存在并列最大序号,会返回多条记录,需要的话可以结合DISTINCT或者其他条件调整。
内容的提问来源于stack exchange,提问作者SAH
相关产品推荐
相关产品推荐

