2016-08-02 44 views
0

我需要寫甲骨文的SQL查詢來獲取像below.Both開始和結束日期的輸出記錄type.I有這樣

的Oracle SQL查詢發現具有具有特定狀態最大日期

一個文件的日期數據
ApName DbName Status StartDate EndDate 
A1 A11 Success 8/3/2016 8/3/2016 
A1 A11 Failed 8/3/2016 8/3/2016 
A2 A22 Success 8/2/2016 8/2/2016 
A3 A33 Success 8/2/2016 8/2/2016 
A4 A44 Failed 8/2/2016 8/2/2016 
A4 A44 Failed 8/2/2016 8/2/2016 
A4 A44 Success 8/3/2016 8/3/2016 
A5 A55 Failed 8/3/2016 8/3/2016 
A5 A55 Failed 8/3/2016 8/3/2016 
A2 A22 Success 8/3/2016 8/3/2016 

我需要輸出,其中apname和dbname有成功和失敗或只有失敗的狀態。我不希望apname和dbname狀態是成功只。所有這些條件shouldBe這樣適用於最大日期(例如,基於輸入文件2016年8月3日)

ApName DbName Status StartDate EndDate 
    A1 A11 Success 8/3/2016 8/3/2016 
    A1 A11 Failed 8/3/2016 8/3/2016 
    A5 A55 Failed 8/3/2016 8/3/2016 
    A5 A55 Failed 8/3/2016 8/3/2016 
+0

哪裏是你的SQL查詢?請發佈它,以便我們可以幫助您解決任何無法正常工作的問題。 – sstan

+0

我不明白結果如何解釋。 –

+0

爲什麼'A4'不在結果集中?它有「失敗」和「成功」... – a1ex07

回答

0

假設狀態可以是 '成功' 或'失敗',它應該做的工作:

SELECT * FROM 
(
    SELECT a.* , 
    count(distinct Status) over (partition by a.AppName, trunc(a.EndDate)) as statusCnt, 
    max(endDate) over(partition by a.AppName) as lastDate 
    FROM your_table a 
)b 
WHERE trunc(b.lastDate) = trunc(b.EndDate) AND (statusCnt > 1 OR Status = 'Failed'); 

雖然我可能會誤解有關「最大日期」的部分。我的查詢比較每個AppName的最大日期,而不是整體最大日期。

+0

非常感謝你的努力。實際上,我需要整體最大日期而不是appname max date.i試圖編輯你的查詢並處理它。我得到了結果,但是一些不需要的記錄也來了。 – Naresh

+0

SELECT * FROM ( SELECT * FROM ( 選擇一個。*, 計數(不同狀態)以上(由a.app_name,a.db_name,a.backup_type,a.env_name,TRUNC(a.end_time)分區)as statusCnt, max(end_time)over(由a.App_Name,a.db_name,a.backup_type,a.env_name分區)as lastDate FROM backup_status a )b WHERE trunc(b.lastDate)= trunc(b .end_time)AND(statusCnt> 1 OR Status ='FAILED'))其中to_date(end_time,'DD-MON-YY')=(從backup_status中選擇to_date(max(end_time),'DD-MON- – Naresh

+0

謝謝a1ex07.its工作... – Naresh

0

所以,如果我理解正確的話,你想返回所有行對於給定apname如果有至少在最大日期爲failed的單一狀態?

如果是的話,這應該讓你使用max over在正確的方向前進:

select t.* 
from yourtable t join (
    select apname, enddate, status, max(enddate) over() maxenddate 
    from yourtable 
) t2 on t2.apname = t.apname and 
    t2.maxenddate = t.enddate and 
    t2.status = 'Failed' 

exists另一種方法:

select t.* 
from yourtable t 
where enddate = (select max(enddate) from yourtable) 
    and exists (
     select 1 
     from yourtable t2 
     where t.apname = t2.apname 
      and t.enddate = t2.enddate 
      and t2.status = 'Failed' 
) 
+0

如果在最大日期內至少有一個FAILED,則這些查詢不會返回給定apname(和dbname)的所有行 - 它們只返回enddate等於maxenddate的行。 – mathguy

0

這是一個使用解析函數但沒有連接的解決方案。

假設

的日期可包含時間元素(時間 - 天)。要求是返回至少有一行FAILED狀態和EndDate與表中所有結束符的最大值相同的應用程序/數據庫的行(但可能是更早的時間)。

對於這些應用程序/數據庫對,返回表中的所有行。 (如果要求是從最大日期只返回行,問題會更容易些。)

查詢

with 
    inputs (ApName, DbName, Status, StartDate, EndDate) as (
     select 'A1', 'A11', 'Success', to_date('8/3/2016', 'mm/dd/yyyy'), to_date('8/3/2016', 'mm/dd/yyyy') from dual union all 
     select 'A1', 'A11', 'Failed' , to_date('8/3/2016', 'mm/dd/yyyy'), to_date('8/3/2016', 'mm/dd/yyyy') from dual union all 
     select 'A2', 'A22', 'Success', to_date('8/2/2016', 'mm/dd/yyyy'), to_date('8/2/2016', 'mm/dd/yyyy') from dual union all 
     select 'A3', 'A33', 'Success', to_date('8/2/2016', 'mm/dd/yyyy'), to_date('8/2/2016', 'mm/dd/yyyy') from dual union all 
     select 'A4', 'A44', 'Failed' , to_date('8/2/2016', 'mm/dd/yyyy'), to_date('8/2/2016', 'mm/dd/yyyy') from dual union all 
     select 'A4', 'A44', 'Failed' , to_date('8/2/2016', 'mm/dd/yyyy'), to_date('8/2/2016', 'mm/dd/yyyy') from dual union all 
     select 'A4', 'A44', 'Success', to_date('8/3/2016', 'mm/dd/yyyy'), to_date('8/3/2016', 'mm/dd/yyyy') from dual union all 
     select 'A5', 'A55', 'Failed' , to_date('8/3/2016', 'mm/dd/yyyy'), to_date('8/3/2016', 'mm/dd/yyyy') from dual union all 
     select 'A5', 'A55', 'Failed' , to_date('8/3/2016', 'mm/dd/yyyy'), to_date('8/3/2016', 'mm/dd/yyyy') from dual union all 
     select 'A2', 'A22', 'Success', to_date('8/3/2016', 'mm/dd/yyyy'), to_date('8/3/2016', 'mm/dd/yyyy') from dual 
    ), 
    prep (apname, dbname, status, startdate, enddate, fdate, mdate) as (
     select apname, dbname, status, startdate, enddate, 
       max(case when status = 'Failed' then enddate end) over 
                  (partition by apname, dbname), 
       max(enddate) over() 
     from inputs 
    ) 
select apname, dbname, status, startdate, enddate 
from prep 
where fdate >= trunc(mdate) 
; 

輸出

APNAME DBNAME STATUS STARTDATE ENDDATE 
------ ------ ------- ---------- ---------- 
A1  A11 Failed 2016-08-03 2016-08-03 
A1  A11 Success 2016-08-03 2016-08-03 
A5  A55 Failed 2016-08-03 2016-08-03 
A5  A55 Failed 2016-08-03 2016-08-03 

4 rows selected.