2016-08-02 23 views
0
私はbelow.Both開始日と終了日のような出力を得るために、Oracle SQLクエリを記述する必要が

を持つレコードを見つけるためにあるこの

OracleのSQLクエリは、特定のステータス持つ最大日付

のようなファイルを持っているtype.I DATEデータ
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が成功して失敗するか、失敗したstatusだけを出力する必要があります。ステータスが成功した場合は、apnameとdbnameは必要ありません。このすべての条件shouldbeは私が正しく理解してるのであれば、あなたがそこにあれば与えられたapnameのためのすべての行を返すようにしたい最大の日付のために(入力ファイルに基づいて、例えば、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

URの努力に本当に感謝しています。実際にはappname max date.iではない全体の最大日付が必要です.URLクエリを編集しようとしています。結果はありますが、reequiredでないレコードもあります。 ( FROM ( SELECT * FROM – Naresh

+0

SELECT *を選択します。*、 数(個別の状況を)a.app_name、a.db_name、a.backup_type、a.env_name、TRUNC(a.end_time)によってパーティション(上)statusCnt a.App_Name、a.db_name、a.backup_type、a.env_nameによってパーティション(上、 MAX(END_TIME))backup_status ) B TRUNC(b.lastDate)= TRUNC(B FROMとしてlastDate としてDD_ MON-YY)=(to_date(max(end_time)、 'DD-MON-YY')from backup_status)ここで、to_date(end_time、 'DD-MON-YY')= – Naresh

+0

ありがとうa1ex07.its働いています... – Naresh

0

を適用しました最大日付で少なくとも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

これらの照会は、指定されたapname(およびdbname)のすべての行を最大日付にFAILEDが少なくとも1つも戻さない場合は戻しません - maxenddateと等しい終了日を持つ行のみを戻します。 – mathguy

0

ここには分析関数を使用したソリューションがありますが、結合はありません。

仮定

日付は時間要素(時刻)を含有してもよいです。要件は、テーブル内のすべての終了日の最大値と同じ日にFAILEDステータスと終了日数を持つ少なくとも1つの行を持つアプリケーション/データベースの行を戻すことです(ただし、おそらく早い時刻)。

これらのアプリケーション/データベースのペアの場合は、テーブルからすべての行を返します。 (要件は、最大日から行のみを返すようにした場合、問題が容易になるだろう。)

クエリ

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. 
関連する問題