在Microsoft SQL Server 2014中查询每个ID对应最大Time值的完整行数据
解决SQL Server 2014中获取每个ID最大Time对应Name的问题
没问题,我来帮你搞定这个需求!针对你使用的SQL Server 2014版本,这里有两种简单易理解且完全兼容的方法:
方法一:使用窗口函数ROW_NUMBER()
这是最直观的方案,适合新手快速掌握。我们通过给每个ID分组内的行按时间降序编号,取编号为1的行(也就是时间最新的那一行):
SELECT ID, Name, Time FROM ( SELECT ID, Name, Time, -- 按ID分组,每组内按Time从新到旧排序,生成唯一序号 ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Time DESC) AS row_num FROM YourTableName -- 替换成你的实际表名 ) ranked_data WHERE row_num = 1;
说明:
PARTITION BY ID:将数据按ID拆分成独立的分组ORDER BY Time DESC:每个分组内按时间从最新到最旧排序ROW_NUMBER():给每个分组内的行生成唯一序号,最新时间的行序号为1- 外层筛选
row_num = 1,就能精准拿到每个ID对应的目标行
如果你的数据中存在同一个ID有多行时间完全相同的最大时间,想要保留所有这些并列行,可以把ROW_NUMBER()换成RANK(),这样所有并列最大的行都会被返回。
方法二:使用关联子查询
如果你暂时还不熟悉窗口函数,这种基于子查询关联的方法也能实现需求:
SELECT t_main.ID, t_main.Name, t_main.Time FROM YourTableName t_main WHERE t_main.Time = ( -- 子查询获取当前ID对应的最大时间值 SELECT MAX(Time) FROM YourTableName t_sub WHERE t_sub.ID = t_main.ID );
说明:
- 子查询会为每个ID单独计算出对应的最大Time值
- 外层表通过匹配ID和这个最大Time值,直接拿到对应的Name字段
- 注意:如果同一个ID有多个行的Time是并列最大的,这个方法会返回所有这些行;如果只需要一行结果,可以结合
TOP 1和ORDER BY调整,但方法一的窗口函数会更灵活。
额外提示
如果你的表数据量较大,建议给ID和Time字段创建联合索引,能显著提升这两种查询的执行效率。
内容的提问来源于stack exchange,提问作者Jdbfkfo




