2017-11-01 3 views
0

Ich habe eine Oracle-Datenbank, wo ich durch alle 5 Minuten eine Reihe von Daten zu gruppieren müssen .. so habe ich eine Tabelle Daten genannt, die drei Felder habenWie werden Daten alle 5 Minuten gruppiert?

  • ID ==> eindeutigen Primärschlüssel
  • Erstellt ==> Datetime-Feld
  • Position ==> numerische ==> kann eine der folgenden Zahlen 1, 2, 3, 4

Die Datentabelle aus einer Anwendung bevölkert wird, die Daten protokolliert ...

Ich brauche die folgenden zu bekommen,

  • where-Klausel, die ein Startdatum und -zeit und Enddatum und Zeit

auf der Grundlage der Klausel where i müssen die Daten aufgeschlüsselt in 5 Minuten gibt Segmente und zeigt, wie viele Position zählt es gibt ..

so etwas, wie beispielsweise muss ich das Ergebnis Ende,

Date Time    POS COUNT(1) 
31/10/2017 6:00:00 AM 1 7 
31/10/2017 6:00:00 AM 2 6 
31/10/2017 6:00:00 AM 3 7 
31/10/2017 6:05:00 AM 1 4 
31/10/2017 6:05:00 AM 2 10 
31/10/2017 6:05:00 AM 3 24 
31/10/2017 6:10:00 AM 1 6 
31/10/2017 6:10:00 AM 2 12 
31/10/2017 6:10:00 AM 3 6 

Jede Hilfe ist willkommen ... es ist eine Oracle-Datenbank ... auch das Datum ist im GMT-Format und ich brauche es in der australischen Datum und Uhrzeit

Dank

Antwort

0

Eine Methode sei:

select trunc(Created) + (floor(extract(minute from Created)/5) * 5)/(24*60) as minutes, 
     pos, count(*) 
from data t 
group by trunc(Created) + (floor(extract(minute from Created)/5) * 5)/(24*60) 
order by minutes; 
+0

können Sie bitte diese Abfrage bitte erklären .. auch wo das erstellte Feld verwendet? – user2206329

+0

Ich bekomme den folgenden Fehler - ungültiges Extrahierfeld und extrahiere Quelle .... – user2206329

+0

@ user2206329. . . Sehen Sie, ob es mit den richtigen Spaltennamen funktioniert. –

0

ich benutze diese generische Funktion:

CREATE FUNCTION IntervalFloor(ts IN TIMESTAMP, roundInterval IN INTERVAL DAY TO SECOND) RETURN TIMESTAMP DETERMINISTIC IS 
    denom INTEGER; 
BEGIN 
    IF roundInterval >= INTERVAL '1' HOUR THEN 
     denom := EXTRACT(HOUR FROM roundInterval); 
     IF MOD(24, denom) <> 0 THEN 
      RAISE VALUE_ERROR; 
     END IF; 
     RETURN TRUNC(ts) + TRUNC(EXTRACT(HOUR FROM ts)/denom) * denom * INTERVAL '1' HOUR; 
    ELSIF roundInterval >= INTERVAL '1' MINUTE THEN 
     denom := EXTRACT(MINUTE FROM roundInterval); 
     IF MOD(60, denom) <> 0 THEN 
      RAISE VALUE_ERROR; 
     END IF; 
     RETURN TRUNC(ts, 'hh') + TRUNC(EXTRACT(MINUTE FROM ts)/denom) * denom * INTERVAL '1' MINUTE; 
    ELSE 
     denom := EXTRACT(SECOND FROM roundInterval);     
     IF MOD(60, denom) <> 0 THEN 
      RAISE VALUE_ERROR; 
     END IF; 
     RETURN TRUNC(ts, 'mi') + TRUNC(EXTRACT(SECOND FROM ts)/denom) * denom * INTERVAL '1' SECOND; 
    END IF; 
END IntervalFloor; 

Dann können Sie es wie

verwenden
select IntervalFloor(Created, INTERVAL '5' MINUTE), Position, count(*) 
from your_table 
group by Position, IntervalFloor(Created, INTERVAL '5' MINUTE); 

Die Funktion benötigt ein beliebiges Intervall von 1 Sekunde bis 24 Stunden, das an einem Tag integer ist.

Verwandte Themen