2016-06-21 20 views
11

Denetim ile ilgili kayıtları içeren bir tablom var. Onay durumunu 'N' ve 'Y' değeriyle saklayan bir sütun var. Yakın zamanda 'Y' onaylama statüsünden 'N' olarak değiştirilen rekoru bulmalıyım.En son değiştirilen satırı nasıl bulabilirim?

Örnek veriler:

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 

Gerekli çıkış:

Request_No approve_status request_create_date   audit_no_in 
22866   N    2016-06-21 11:46:52.3660000 1015 

bir Yardım büyük takdir.

cevap

7

Birlikte LEAD() ve ROW_NUMBER() kullanabilirsiniz:

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 

ilk iç sorgu son durumu seçin N için Y değiştirmek ve onların tarihlerde onlara tabanını sırada yer vermedi ikinci bir filtre olanlar, üçüncü bir filtre sadece en yeni değişimi.

+0

Bu bir cazibe gibi çalıştı. Sadece küçük bir düzenleme-- SELECT s. *, ROW_NUMBER() OVER (s.request_no ORDER BY s.request_create_date DESC BY) –

0

İstediğiniz sonucu bulmak için başka bir yol kullanıyorum. Sadece bir 'N' kaydının güncellendiği bir 'Y' kaydını arayın. Ayrıca, veritabanı motorunuzun sürümü 2008 ise, hala işleyebilir.

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')) 
İlgili konular