MSSQL新手求助:如何按日期时间从两表获取指定环境的最新记录
解决MSSQL筛选特定环境下每个Code的最新记录需求
嘿,作为MSSQL新手,这个需求其实挺常见的,我来帮你一步步搞定~
需求明确
你需要:
- 筛选出test环境下每个
code对应的最新(日期时间最晚)记录 - 关联表1获取
code对应的显示名称name - 按指定格式输出结果
实现SQL代码
假设你的表1名为CodeNames,表2名为ResultHistory(如果实际表名不同,记得替换):
WITH RankedResults AS ( SELECT t2.code, t2.result, t2.environment, t2.date, t2.time, -- 按code分组,每组内按日期时间倒序排名,最新记录排第1 ROW_NUMBER() OVER (PARTITION BY t2.code ORDER BY t2.date DESC, t2.time DESC) AS rn FROM 表2 t2 WHERE t2.environment = 'test' -- 替换成你需要的目标环境 ) SELECT rr.code, t1.name, rr.result, rr.date, rr.time FROM RankedResults rr INNER JOIN 表1 t1 ON rr.code = t1.code WHERE rr.rn = 1 -- 仅保留每个code的最新记录 ORDER BY rr.code; -- 按code排序,和示例输出一致
代码说明
- CTE分组排名:用
RankedResults这个公共表表达式,给表2的记录按code分组,每组内按date和time倒序排序,最新的记录会被标记为rn=1。 - 关联表获取名称:通过
INNER JOIN关联表1,把code对应的name带出来。 - 筛选最新记录:通过
WHERE rr.rn = 1只保留每个code的最新一条记录。
注意事项
如果你的date和time是字符串类型(而非datetime类型),直接按字符串排序可能会出错(比如16/08/2019和12/08/2019字符串排序会优先比较第一个数字),这时候可以把日期时间合并后转换成datetime类型再排序:
-- 修改ORDER BY部分 ORDER BY CONVERT(DATETIME, t2.date + ' ' + t2.time, 103) DESC
这里的103是MSSQL中对应DD/MM/YYYY格式的转换代码,如果你的日期格式不同,需要调整对应的格式代码。
内容的提问来源于stack exchange,提问作者Saranya Senthil
相关产品推荐
相关产品推荐

