2010-11-23 3 views
1

Ich habe eine Reihe von Metriken von Sekunde gespeichert. Ich versuche, einen Bericht zu erstellen, der die folgenden erreichen wird:Wählen Sie leere Daten für keine Daten von Oracle?

  • avg Metrik Stunde
  • max pro Stunde
  • min pro Stunde
  • enthalten das Datum/Zeit stundenlang mit keine Daten

Diese Abfrage erzeugt fast die richtigen Ergebnisse. Seit Tagen gibt es jedoch Daten. Ich möchte NICHT, dass die UNION-Ergebnisse Nullwerte ergeben. Ich möchte, dass diese abfallen.

SELECT HOUR, METRIC, MINIMUM, MAXIMUM FROM (
select 
    to_char(day,'DD-MON-YY "-" HH24":00"') AS HOUR, 
    round(avg(duration), 2) AS METRIC, 
    round(min(duration), 2) AS MINIMUM, 
    round(max(duration), 2) AS MAXIMUM 
from log_events 
where day > to_date('08-NOV-10', 'DD-MON-YY') 
    and day < to_date('08-NOV-10', 'DD-MON-YY') + 2 
    and company = 'company A' 
    and component = 'api layer' 
    and event_label = 'execution request' 
    group by to_char(day,'DD-MON-YY "-" HH24":00"') 
    UNION 
    select to_char(trunc(to_date('08-NOV-10', 'DD-MON-YY'))+(level-1)/24, 'DD-MON-YY "-" HH24":00"') HOUR, 
    null as METRIC, 
    null as MINIMUM, 
    null as MAXIMUM 
    from dual connect by level <= 48 
) 
order by HOUR; 

Ich bin nicht einmal sicher, ob dies der richtige Weg ist, um die Daten abzufragen. Irgendein Rat?

Antwort

1

eine Inline-Tabelle mit den Stunden und nutzen es zu Ihrem log_events Tisch sitzen links:

select 
    dummy_hours.hour, 
    log_aggregate.METRIC, 
    log_aggregate.MINIMUM, 
    log_aggregate.MAXIMUM 
from (
    select to_char(trunc(to_date('08-NOV-10', 'DD-MON-YY'))+(level-1)/24, 'DD-MON-YY "-" HH24":00"') HOUR 
    from dual connect by level <= 48 
) dummy_hours, (
    select to_char(day,'DD-MON-YY "-" HH24":00"') AS HOUR, 
    round(avg(duration), 2) AS METRIC, 
    round(min(duration), 2) AS MINIMUM, 
    round(max(duration), 2) AS MAXIMUM 
    from log_events 
    where day between to_date('08-NOV-10', 'DD-MON-YY') and to_date('08-NOV-10', 'DD-MON-YY') + 2 
    and day > to_date('08-NOV-10', 'DD-MON-YY') 
    and day < to_date('08-NOV-10', 'DD-MON-YY') + 2 
    and company = 'company A' 
    and component = 'api layer' 
    and event_label = 'execution request' 
    group by to_char(day,'DD-MON-YY "-" HH24":00"') 
) log_aggregate 
where dummy_hours.hour = log_aggregate.hour(+) 
order by dummy_hours.hour; 
+0

Es scheint ein Fehler irgendwo in der Aussage. Ich habe das Komma aus SELECT in dummy_hours entfernt. Ich habe bestätigt, dass beide Abfragen unabhängig voneinander funktionieren (dummy_hours und log_aggregate). Wenn ich die Abfrage ausführe, erhalte ich jedoch den Fehler "fehlender Ausdruck". –

+0

Ich korrigierte das Komma und enthielt einen Tabellenalias in der ORDER BY (ich vermute, dass das den Fehler verursacht hat). Kannst du bestätigen? –

+0

Ich bekomme immer noch den gleichen Fehler. (Fehlender Ausdruck). Ich kann jede der Abfragen unabhängig ausführen und sie funktionieren gut. Aber wenn kombiniert, erhalte ich den Fehler. –