WITH PARAMS(Stichtag) AS(
SELECT DATE'2017-12-26' from dual
-- Für diesen Tag berichten...
)
-- select * from params
,
TLOG AS(
SELECT 'JOB_A' JOB, 4 ERRORLEVEL, TO_DATE('13.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 4 ERRORLEVEL, TO_DATE('14.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 4 ERRORLEVEL, TO_DATE('15.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 5 ERRORLEVEL, TO_DATE('15.12.2017 10:09', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 5 ERRORLEVEL, TO_DATE('15.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_B' JOB, 5 ERRORLEVEL, TO_DATE('15.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 5 ERRORLEVEL, TO_DATE('16.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_B' JOB, 5 ERRORLEVEL, TO_DATE('14.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 5 ERRORLEVEL, TO_DATE('17.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_C' JOB, 5 ERRORLEVEL, TO_DATE('21.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_B' JOB, 5 ERRORLEVEL, TO_DATE('15.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 4 ERRORLEVEL, TO_DATE('18.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 5 ERRORLEVEL, TO_DATE('18.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_B' JOB, 5 ERRORLEVEL, TO_DATE('19.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_C' JOB, 5 ERRORLEVEL, TO_DATE('19.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 4 ERRORLEVEL, TO_DATE('19.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 5 ERRORLEVEL, TO_DATE('19.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 4 ERRORLEVEL, TO_DATE('20.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 5 ERRORLEVEL, TO_DATE('20.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 4 ERRORLEVEL, TO_DATE('21.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 5 ERRORLEVEL, TO_DATE('21.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 4 ERRORLEVEL, TO_DATE('22.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 5 ERRORLEVEL, TO_DATE('22.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 4 ERRORLEVEL, TO_DATE('23.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 5 ERRORLEVEL, TO_DATE('23.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 4 ERRORLEVEL, TO_DATE('24.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 5 ERRORLEVEL, TO_DATE('24.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 4 ERRORLEVEL, TO_DATE('26.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL UNION ALL
SELECT 'JOB_A' JOB, 5 ERRORLEVEL, TO_DATE('26.12.2017 13:12', 'DD.MM.YYYY HH24:MI') TS FROM DUAL
), feiertage as (
select to_date('25.12.2017', 'dd.mm.yyyy') as feiertag from dual
-- mal zur Probe mal den 1.Weihnachtstag als einen Feiertag definieren
)
-- die Logdaten auf Tage zusammengefasst brauchen wir auf jeden Fall
, tlogbyday as (
Select job, errorlevel, trunc(ts) as logdate, count(*) as cnt
from tlog
group by job, errorlevel, trunc(ts)
)
-- select * from tlogbyday
, solltermine as (
Select rownum as rn, solltermin
from (
select trunc(sysdate)+1-rn as Solltermin
from
( select rownum rn
from dual
connect by level <= 100)
-- die letzten 100 Tage...
)
where (1=1)
-- alle Datumswerte <= <<stichtag
and solltermin <= (select stichtag from params)
-- Feiertage ausfiltern. Annahme: Feiertage gelten für alle Jobs
and solltermin not in (Select Feiertag from feiertage)
)
-- select * from solltermine
-- Hier festlegen, welche Jobs wann laufen sollen
, jobruntermine as (
Select jr.*
, row_number() over (partition by jr.job
order by jr.solltermin desc) as jobrn
From (
Select 'JOB_A' as job, solltermin from solltermine
-- JOB_A läuft jeden Tag außer Feiertage
UNION ALL
Select 'JOB_B' as job, solltermin from solltermine
-- JOB_B läuft nicht Samstags und Sonntags
WHERE to_char(solltermin, 'D') between 2 and 6
UNION ALL
Select 'JOB_C' as job, solltermin from solltermine
-- JOB_C läüft nur Dienstag und Donnerstag
WHERE to_char(solltermin, 'D') in (3, 5)
) jr
)
-- select * from jobruntermine
, relevantRuns as (
select t.job, t.errorlevel from tlogbyday t
where trunc(t.logdate) in (select stichtag from params)
)
-- endgültige Auswertung
select x.job, x.errorlevel
, min(logdate) as vondatum
, max(logdate) as bisdatum, sum(cnt) as sumfailed
, sum(oneday) as days_in_row
from (
select
row_number() over (partition by t.job, t.errorlevel order by t.logdate desc) as trn
, jr.jobrn
, 1 as oneday
, t.*
from tlogbyday t
inner join relevantruns rr on rr.job =t.job and rr.errorlevel=t.errorlevel
left join jobruntermine jr on jr.job=t.job and jr.solltermin=t.logdate
) x
where x.jobrn=x.trn
group by x.job, x.errorlevel