You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:25:39