Optimale Weg, um erstellen Sie ein Histogramm mit der Häufigkeitsverteilung in Oracle?
Ich habe eine events
Tabelle mit zwei Spalten eventkey
(unique, primary-key) und createtime
speichert die Erstellungszeit der Veranstaltung, die als Anzahl der Millisekunden seit Jan 1 1970 in einem NUMBER
Spalte.
Ich würde gern ein "Histogramm" oder Häufigkeitsverteilung, die mir zeigt, wie viele Ereignisse wurden in jeder Stunde in der letzten Woche.
Ist dies die beste Art und Weise zu schreiben, wie eine Abfrage in Oracle, mit der width_bucket()
Funktion? Ist es möglich, daraus die Anzahl der Zeilen, die fallen in jeden Eimer mit einem der anderen Oracle analytische Funktionen, anstatt mit width_bucket
zu bestimmen, was die bucket-Zahl jeder Reihe gehört und dabei ein count(*)
damit?
-- 1305504000000 = 5/16/2011 12:00am GMT
-- 1306108800000 = 5/23/2011 12:00am GMT
select
timestamp '1970-01-01 00:00:00' + numtodsinterval((1305504000000/1000 + (bucket * 60 * 60)), 'second') period_start,
numevents
from (
select bucket, count(*) as events from (
select eventkey, createtime,
width_bucket(createtime, 1305504000000, 1306108800000, 24 * 7) bucket
from events
where createtime between 1305504000000 and 1306108800000
) group by bucket
)
order by period_start
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihr
createtime
wurden eine Datums-Spalte, das wäre trivial:Als es ist, warf den
createtime
Spalte ist nicht allzu schwer:Wenn, alternativ, die Sie suchen für die fencepost Werte (zum Beispiel, wenn ich vom ersten Dezil (0-10%) auf die nächste (11-20%), Sie würden etwas tun wie:
Ich bin nicht vertraut mit Oracle-Datums-Funktionen, aber ich bin ziemlich sicher, es gibt eine gleiche Weise, dies zu schreiben Postgres Anweisung:
Ziemlich viel die gleiche Reaktion wie Adam, aber ich würde lieber halten Sie die period_start als ein Zeit-Feld, so ist es einfacher zu filtern weitere, wenn nötig:
with events as ()
Teil, und warum sind Sie ein zufälliges auswählen von Werten? Ich bin nicht sehr vertraut mit Oracle syntax