SQL Server:如何从ID不同的重复数据中获取最新时间的唯一行?
按NAME、CARD_NO分组取最新CREATED记录的SQL解决方案
原查询的问题
你的SQL语句SELECT ID, NAME,MAX(CREATED),TYPE,CARD_NO FROM users group by ID,NAME,TYPE,CARD_NO存在两个核心问题:
- 分组维度错误:将唯一字段
ID和TYPE加入GROUP BY,导致每条记录单独成组,完全偏离了按NAME、CARD_NO分组的需求。 - 字段匹配逻辑错误:即使分组正确,直接聚合
MAX(CREATED)无法保证ID、TYPE等字段属于该组内时间最新的那条记录。
正确解决方案
方案1:窗口函数(推荐,支持MySQL 8+、PostgreSQL、SQL Server等)
利用窗口函数对每组数据排序,直接提取最新记录:
SELECT ID, NAME, CREATED, TYPE, CARD_NO FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY NAME, CARD_NO ORDER BY CREATED DESC) AS row_rank FROM users ) ranked_users WHERE row_rank = 1;
逻辑说明:
PARTITION BY NAME, CARD_NO:按NAME和CARD_NO将数据分成不同组ORDER BY CREATED DESC:每组内按创建时间倒序排列ROW_NUMBER():为每组内的记录分配排名,排名1的就是时间最新的记录
方案2:关联子查询(兼容旧版本数据库)
先获取每组的最新时间,再关联原表取出完整记录:
SELECT u.ID, u.NAME, u.CREATED, u.TYPE, u.CARD_NO FROM users u JOIN ( SELECT NAME, CARD_NO, MAX(CREATED) AS latest_created FROM users GROUP BY NAME, CARD_NO ) group_latest ON u.NAME = group_latest.NAME AND u.CARD_NO = group_latest.CARD_NO AND u.CREATED = group_latest.latest_created;
注意:如果同一组内存在多条创建时间相同的最新记录,该方案会返回所有符合条件的记录;若需唯一结果,可额外添加ID的排序或聚合逻辑。
内容的提问来源于stack exchange,提问作者Waheed
相关产品推荐
相关产品推荐

