Оптимальный способ создания гистограммы / частотного распределения в Oracle?

У меня есть таблица событий с двумя столбцами 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
7
задан matt b 1 June 2011 в 13:32
поделиться

1 ответ

Используя оракула обеспечил функцию" 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 значениям.

0
ответ дан 6 December 2019 в 13:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: