У меня есть таблица событий
с двумя столбцами eventkey
(уникальный, первичный ключ) и createtime
, который сохраняет время создания события как количество миллисекунд с 1 января 1970 года в столбце ЧИСЛО
.
Я хотел бы создать «гистограмму» или частотное распределение, которое показывает мне, сколько событий было создается каждый час прошлой недели.
Это лучший способ написать такой запрос в Oracle, используя функцию width_bucket ()
? Можно ли получить количество строк, попадающих в каждую корзину, с помощью одной из других аналитических функций Oracle вместо использования width_bucket
, чтобы определить, к какому номеру корзины принадлежит каждая строка, и выполнения подсчета (* )
сверх этого?
-- 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
Используя оракула обеспечил функцию" WIDTH_BUCKET" для накопления текущих данных или прекрасных дискретных данных. Следующий пример показывает способ создать гистограмму с 5 блоками и собрать "COLUMN_VALUE" от 510 до 520 (таким образом, каждый блок получает значения диапазона 2). WIDTH_BUCKET создаст дополнительный id=0 и num_buckets+1 блоки для значений ниже минуты и выше максимум
SELECT "BUCKET_ID", count(*),
CASE
WHEN "BUCKET_ID"=0 THEN -1/0F
ELSE 510+(520-510)/5*("BUCKET_ID"-1)
END "BUCKET_MIN",
CASE
WHEN "BUCKET_ID"=5+1 THEN 1/0F
ELSE 510+(520-510)/5*("BUCKET_ID")
END "BUCKET_MAX"
FROM
(
SELECT "COLUMN_VALUE",
WIDTH_BUCKET("COLUMN_VALUE", 510, 520, 5) "BUCKET_ID"
FROM "MY_TABLE"
)
group by "BUCKET_ID"
ORDER BY "BUCKET_ID";
, Образец произвел
BUCKET_ID COUNT(*) BUCKET_MIN BUCKET_MAX
---------- ---------- ---------- ----------
0 45 -Inf 5.1E+002
1 220 5.1E+002 5.12E+002
2 189 5.12E+002 5.14E+002
3 43 5.14E+002 5.16E+002
4 3 5.16E+002 5.18E+002
В моей таблице, существует № 518-520, таким образом, блок с id=5 не показывают. С другой стороны, существуют значения ниже минуты (510), таким образом, существует блок с id=0, собираясь-inf к 510 значениям.