如何查找最近更改的行?
问题描述:
我有一个包含审计相关记录的表。有一列存储值为'N'和'Y'的审批状态。我必须找到最近从批准状态“Y”变为“N”的记录。如何查找最近更改的行?
的样本数据:
Request_No approve_status request_create_date audit_no_in
22866 N 2016-06-21 11:47:12.7530000 1016
22866 N 2016-06-21 11:46:52.3660000 1015
22866 Y 2016-06-21 11:46:13.9290000 1014
22866 Y 2016-06-21 11:45:14.3200000 1013
22866 N 2016-06-21 11:37:27.9410000 1012
22866 Y 2016-06-21 11:37:03.4510000 1011
22866 N 2016-06-21 11:32:29.6310000 1010
22866 Y 2016-06-21 11:31:41.0270000 1009
22866 N 2016-06-20 19:17:30.4820000 1008
22866 N 2016-06-20 19:14:30.4720000 1007
22866 Y 2016-06-02 13:12:53.5170000 1006
需要的输出:
Request_No approve_status request_create_date audit_no_in
22866 N 2016-06-21 11:46:52.3660000 1015
任何帮助将不胜感激。
答
您可以使用LEAD()
和ROW_NUMBER()
在一起:
SELECT p.request_no,p.approve_status,p.request_create_date,p.audit_no_in
FROM(
SELECT s.*,
ROW_NUMBER() OVER(PARTITION BY s.request_no ORDER BY s.request_create_date DESC) as rnk
FROM (
SELECT t.*,
LEAD(t.approve_status,1,0) OVER(PARTITION BY t.request_no ORDER BY t.request_create_date DESC) as last_status
FROM YourTable t) s
WHERE s.approve_status = 'Y' AND s.last_status = 'N') p
WHERE p.rnk = 1
第一内查询选择最后的状态,第二个过滤器这些谁没有从Y
更改为N
和他们排名基础上,他们的约会,第三个只过滤最新的变化。
答
我用另一种方法找到你想要的结果。只需搜索最近有'N'记录更新的'Y'记录。另外,如果你的数据库引擎版本是2008,它仍然可以处理。
SQL:
select * from Table1 where audit_no_in = (
select Max(audit_no_in) + 1
from Table1
where approve_status ='Y'
and audit_no_in < (select max(audit_no_in) from Table1 where approve_status ='N'))
它的工作就像一个魅力。只是一个小编辑 - SELECT s。*, ROW_NUMBER()OVER(PARTITION BY s.request_no ORDER BY s.request_create_date DESC)as rnk –