Время нарезки в Oracle / SQL - PullRequest
       20

Время нарезки в Oracle / SQL

5 голосов
/ 19 декабря 2008

У меня есть таблица Oracle большого размера, содержащая строки, представляющие единицы работы, со столбцами для времени начала и окончания в дополнение к другим метаданным.

Мне нужно сгенерировать графики использования из этих данных, учитывая некоторые произвольные критерии фильтрации и отчетный период времени. Например, покажите мне график всех работ Алисы за 24-часовой период, начинающийся в прошлый вторник в 7:00 утра. Каждая строка БД будет располагаться вертикально на графике.

Я мог бы сделать это на языке высокого уровня, запросив все потенциально релевантные строки, разбив каждую из них на 1-минутные сегменты и построив график результата. Но есть ли эффективный способ сделать это время нарезки в SQL? Или существует технология Oracle, которая делает это?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 19 декабря 2008

С точки зрения получения данных вы можете использовать 'group by' и ' truncate ', чтобы разделить данные на 1-минутные интервалы. например:

SELECT user_name, truncate(event_time, 'YYYYMMDD HH24MI'), count(*)
FROM job_table
WHERE event_time > TO_DATE( some start date time)
AND user_name IN ( list of users to query )
GROUP BY user_name, truncate(event_time, 'YYYYMMDD HH24MI') 

Это даст вам результаты, как показано ниже (при условии, что для Алисы имеется 20 строк между 8.00 и 8.01 и 40 строками между 8.01 и 8.02):

Alice  2008-12-16 08:00   20
Alice  2008-12-16 08:01   40
0 голосов
/ 10 января 2009

Это должно сделать это довольно хорошо. Он будет разбит на минуты (1/1440 дня).

SELECT 
  to_char(Times.time,'hh24:mi'),
  count(*)   
FROM   
  (SELECT
     time
   FROM  
     dual
   WHERE 
     1=2 
   MODEL 
     dimension by ( 0 as key )
     measures     ( sysdate -1 as time )
     rules upsert ( time[ for key from 0 to 1 increment (1/1440) ] = sysdate-1 + cv(key)) ) Times,
  job_table
WHERE 
  begintime <= Times.time 
AND 
  endtime > Times.time 
AND
  user_name = 'Alice'
GROUP BY 
  Times.time 
ORDER BY
  Times.time

Я уверен, что есть более быстрый способ сделать это, но это лучшее, что я могу придумать. Надеюсь, это поможет.

0 голосов
/ 19 декабря 2008

Лучше всего иметь таблицу (временная таблица будет сгенерирована на лету), а затем присоединиться к ней.

...