如何编写SQL查询获取最新状态为Approved的表单记录
解决方法:筛选最新状态为Approved的表单记录
我来帮你搞定这个需求!要找出最新状态(ChangedDate最大)为Approved的表单,关键是先定位每个表单的最新状态记录,再验证状态是否符合要求。下面提供两种实用的SQL写法,适用于你的SQL Server环境:
方法一:使用窗口函数ROW_NUMBER()(推荐,SQL Server 2008+)
窗口函数能清晰地为每个表单的状态记录排序,直接取最新的那条:
SELECT f.FormId, f.Property1, f.Property2, fs.Status, fs.ChangedDate FROM Forms f INNER JOIN ( SELECT FormId, Status, ChangedDate, -- 按FormId分组,ChangedDate倒序,每条记录分配序号 ROW_NUMBER() OVER (PARTITION BY FormId ORDER BY ChangedDate DESC) AS rn FROM FormStatuses ) fs ON f.FormId = fs.FormId -- 只取每个表单的最新记录,且状态为Approved WHERE fs.rn = 1 AND fs.Status = 'APPROVED';
方法二:使用关联子查询(兼容老版本SQL Server)
通过子查询找到每个表单的最新ChangedDate,再关联匹配状态:
SELECT f.FormId, f.Property1, f.Property2, fs.Status, fs.ChangedDate FROM Forms f INNER JOIN FormStatuses fs ON f.FormId = fs.FormId WHERE -- 匹配当前表单的最新ChangedDate fs.ChangedDate = ( SELECT MAX(ChangedDate) FROM FormStatuses WHERE FormId = fs.FormId ) -- 筛选状态为Approved的记录 AND fs.Status = 'APPROVED';
结果验证
针对你提供的示例数据:
- FormId=5277的最新状态是
REJECTED,不会被返回 - FormId=5276的最新状态是
APPROVED,会被正确返回 - FormId=5275的最新状态是
PENDING,不会被返回
完全符合你的预期需求!
内容的提问来源于stack exchange,提问作者Ashish Yengkhom
相关产品推荐
相关产品推荐

