Сокращение времени в Oracle / SQL
-
22-08-2019 - |
Вопрос
У меня есть таблица Oracle большого размера, содержащая строки, представляющие единицы работы, со столбцами для времени начала и окончания в дополнение к другим метаданным.
Мне нужно сгенерировать графики использования на основе этих данных с учетом некоторых произвольных критериев фильтрации и периода времени отчетности.Например, покажите мне график всех заданий Элис за 24-часовой период, начиная с прошлого вторника в 7:00 утра.Каждая строка базы данных будет располагаться на графике вертикально.
Я мог бы сделать это на языке высокого уровня, запросив все потенциально релевантные строки, разделив время каждой из них на сегменты продолжительностью в 1 минуту и построив график результата.Но есть ли эффективный способ сделать это сокращение времени в SQL?Или существует существующая технология Oracle, которая делает это?
Спасибо!
Решение
Что касается получения данных, вы можете использовать "сгруппировать по" и "усекать' разбить данные на интервалы в 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
Другие советы
Лучше всего иметь таблицу (временную, сгенерированную "на лету", было бы неплохо, если временной срез является динамическим), а затем присоединиться к ней.
Это должно получиться довольно хорошо.Он будет разбит на минуты (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
Я уверен, что есть более быстрый способ сделать это, но это лучшее, что я могу придумать.Надеюсь, это поможет.