SQL实现按人员取最大person_id,忽略不同团队部门的其他行
解决方法
要实现每个人员仅保留最大person_id对应的行,不管其division_name、team_name是否不同,可以用以下两种常见方案:
方案1:窗口函数(推荐,适用于MySQL 8+、PostgreSQL、SQL Server等现代数据库)
使用ROW_NUMBER()窗口函数按人员分组并排序,取每组中person_id最大的行:
WITH ranked_persons AS ( SELECT person_id, person_name, division_name, team_name, -- 按person_name分组,组内按person_id降序排序,标记行号 ROW_NUMBER() OVER (PARTITION BY person_name ORDER BY person_id DESC) AS rn FROM organization_table ) -- 筛选每个组中行号为1的记录(即person_id最大的行) SELECT person_id, person_name, division_name, team_name FROM ranked_persons WHERE rn = 1;
方案2:子查询关联(兼容旧版本数据库,如MySQL 5.x)
先通过子查询获取每个人员的最大person_id,再关联原表获取对应行的完整数据:
SELECT ot.person_id, ot.person_name, ot.division_name, ot.team_name FROM organization_table ot INNER JOIN ( -- 先找出每个person_name对应的最大person_id SELECT person_name, MAX(person_id) AS max_person_id FROM organization_table GROUP BY person_name ) max_ids ON ot.person_name = max_ids.person_name AND ot.person_id = max_ids.max_person_id;
原SQL问题说明
你之前的SQL同时按person_name, division_name, team_name分组,会把同一人员但不同部门/团队的记录拆分成多个分组,导致无法得到每个人员全局最大person_id的行,这就是不符合需求的原因。
内容的提问来源于stack exchange,提问作者Aftersun Lotion
相关产品推荐
相关产品推荐

