Оптимальный способ создания гистограммы / частотного распределения в Oracle?
у меня есть events
таблица с двумя колонками eventkey
(уникальный первичный ключ) и createtime
, который хранит время создания события как количество миллисекунд с 1 января 1970 года в
3 ответов
если createtime
были столбцом даты, это было бы тривиально:
SELECT TO_CHAR(CREATE_TIME, 'DAY:HH24'), COUNT(*)
FROM EVENTS
GROUP BY TO_CHAR(CREATE_TIME, 'DAY:HH24');
как есть, кастинг createtime
столбец не слишком сложно:
select TO_CHAR(
TO_DATE('19700101', 'YYYYMMDD') + createtime / 86400000),
'DAY:HH24') AS BUCKET, COUNT(*)
FROM EVENTS
WHERE createtime between 1305504000000 and 1306108800000
group by TO_CHAR(
TO_DATE('19700101', 'YYYYMMDD') + createtime / 86400000),
'DAY:HH24')
order by 1
если, в качестве альтернативы, вы ищете значения fencepost (например, где я могу перейти от первого дециля (0-10%) к следующему (11-20%), вы сделаете что-то вроде:
select min(createtime) over (partition by decile) as decile_start,
max(createtime) over (partition by decile) as decile_end,
decile
from (select createtime,
ntile (10) over (order by createtime asc) as decile
from events
where createtime between 1305504000000 and 1306108800000
)
Я не знаком с функциями даты Oracle, но я уверен, что есть эквивалентный способ написания этого утверждения Postgres:
select date_trunc('hour', stamp), count(*)
from your_data
group by date_trunc('hour', stamp)
order by date_trunc('hour', stamp)
почти такой же ответ, как у Адама, но я бы предпочел сохранить period_start как поле времени, поэтому при необходимости легче фильтровать дальше:
with
events as
(
select rownum eventkey, round(dbms_random.value(1305504000000, 1306108800000)) createtime
from dual
connect by level <= 1000
)
select
trunc(timestamp '1970-01-01 00:00:00' + numtodsinterval(createtime/1000, 'second'), 'HH') period_start,
count(*) numevents
from
events
where
createtime between 1305504000000 and 1306108800000
group by
trunc(timestamp '1970-01-01 00:00:00' + numtodsinterval(createtime/1000, 'second'), 'HH')
order by
period_start