SQL序列号与起止日期验证脚本求助(SQL Management Studio 2016)
验证锅炉维保表中最新序列号的日期合法性
嘿,欢迎来到社区!作为刚接触SQL Server和SSMS 2016的新手,能主动提问真的很棒😊 针对你的需求,我来给你写个实用的脚本,帮你快速找出每个地址最新维保记录里不符合「开始日期≤结束日期」的情况。
思路说明
我们需要先按地址分组,取出每个地址对应的最新序列号记录,然后再检查这些记录的日期是否合法。这里的「最新」我默认是按记录的开始日期倒序(也就是最近的维保记录),如果你的“最新序列号”是指序列号本身数值最大的,我也会在脚本里标注修改点。
验证脚本
-- 先定义一个CTE,用来筛选每个地址的最新维保记录 WITH LatestBoilerMaintenance AS ( SELECT Address, SerialNumber, StartDate, EndDate, -- 给每个地址的记录按日期倒序编号,最新的记录会标记为1 ROW_NUMBER() OVER (PARTITION BY Address ORDER BY StartDate DESC) AS RecordRank -- 如果是按序列号大小取最新,把上面的ORDER BY改成:ORDER BY SerialNumber DESC FROM YourBoilerMaintenanceTable -- 替换成你实际的表名 ) -- 从CTE中筛选出最新记录,并且找出开始日期大于结束日期的异常数据 SELECT Address, SerialNumber, StartDate, EndDate, '开始日期大于结束日期,数据异常' AS ErrorMessage FROM LatestBoilerMaintenance WHERE RecordRank = 1 -- 只保留每个地址的最新记录 AND StartDate > EndDate; -- 筛选出不合法的日期记录
新手使用提示
- 记得把
YourBoilerMaintenanceTable替换成你实际的表名称,同时确认Address、SerialNumber、StartDate、EndDate这些字段名和你的表一致。 - 如果不确定分组后的最新记录是否正确,可以先去掉
WHERE子句里的AND StartDate > EndDate,运行脚本看看每个地址的第一条记录是不是你要的“最新序列号”记录。 - 运行脚本后,如果返回结果为空,说明所有地址的最新维保记录日期都是合法的;如果有返回行,就是需要修正的异常数据啦。
内容的提问来源于stack exchange,提问作者NuToSQL
相关产品推荐
相关产品推荐

