如何查找最近更改的行?

9

我有一个表格,其中包含与审计相关的记录。有一列存储批准状态的值为'N'和'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

任何帮助都将不胜感激。
2个回答

7

您可以同时使用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

第一次内部查询选择最后状态,第二次过滤掉那些没有从YN的并根据日期对它们进行排序,第三次过滤只保留最新的变化。


它像魔法一样奏效。只需要进行微小的编辑——SELECT s.*, ROW_NUMBER() OVER(PARTITION BY s.request_no ORDER BY s.request_create_date DESC) as rnk - java_maestros

0

我使用另一种方法来找到您想要的结果。只需搜索最近更新了一个“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'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接