2016-06-21 8 views
11

私は監査関連のレコードを含むテーブルを持っています。承認ステータスを値 '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 

任意の助けいただければ幸いです。

答えて

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 

を第一の内側のクエリが最後のステータスを選択し、二つのフィルタをNYから変更し、それらに彼らの日にベースをランク付けしていない人は、 3番目のフィルタは最新の変更のみをフィルタリングします。

+0

それは魅力のように働きました。ちょっとした編集 - SELECT s。*、 ROW_NUMBER()OVER(PARTITION BY s.request_no ORDER BY s.request_create_date DESC)をrnk –

0

私はあなたが望む結果を見つけるために別の方法を使用します。最近 'Y'レコードを検索して、 'N'レコードが更新されている場所を検索してください。また、データベースエンジンのバージョンが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')) 
関連する問題