Добавить в корзинуПозвонить
Найти в Дзене
Oracle APEX

Oracle APEX. Строим график

Сложная страница за 5 минут. Предположим, мы хотим отобразить на Web странице статистику посещения наших сайтов: Сначала определим минимальную и максимальную даты наличия статистики, даты округлим на полночи функцией trunc() без второго параметра: select min(trunc(time_stamp)) from apex_activity_log
;
select max(trunc(time_stamp)) from apex_activity_log
; Иерархическим запросом построим ряд дат от минимальной до максимальной; это нужно, чтоб на графике не было пропусков, если в этот день не было зарегистрировано посещений, а также для согласования серий данных: select (select min(trunc(time_stamp)) from apex_activity_log) + level - 1 as day
from dual
connect by (select min(trunc(time_stamp)) from apex_activity_log) + level - 1 < (select max(trunc(time_stamp)) from apex_activity_log)
; Определим множество отслеживаемых приложений (в этом рабочем пространстве смысловые приложения имеют трехзначные идентификаторы): select distinct flow_id from apex_activity_log where flow_id < 1000
; "Пер

Сложная страница за 5 минут.

Предположим, мы хотим отобразить на Web странице статистику посещения наших сайтов:

Пример желаемого графика
Пример желаемого графика

Сначала определим минимальную и максимальную даты наличия статистики, даты округлим на полночи функцией trunc() без второго параметра:

select min(trunc(time_stamp)) from apex_activity_log
;
select max(trunc(time_stamp)) from apex_activity_log
;

Иерархическим запросом построим ряд дат от минимальной до максимальной; это нужно, чтоб на графике не было пропусков, если в этот день не было зарегистрировано посещений, а также для согласования серий данных:

select (select min(trunc(time_stamp)) from apex_activity_log) + level - 1 as day
from dual
connect by (select min(trunc(time_stamp)) from apex_activity_log) + level - 1 < (select max(trunc(time_stamp)) from apex_activity_log)
;

Определим множество отслеживаемых приложений (в этом рабочем пространстве смысловые приложения имеют трехзначные идентификаторы):

select distinct flow_id from apex_activity_log where flow_id < 1000
;

"Перемножим" ряд дат и множество приложений, создав опорную матрицу:

select flow_id, day from
(
select distinct flow_id from apex_activity_log where flow_id < 1000
),
(
select (select min(trunc(time_stamp)) from apex_activity_log) + level - 1 as day
from dual
connect by (select min(trunc(time_stamp)) from apex_activity_log) + level - 1 < (select max(trunc(time_stamp)) from apex_activity_log)
)
;

Отобразим на опорную матрицу учетные значения и получим готовый запрос:

select
t.flow_id as app_id
, to_char(t.day, 'yyyy-mm-dd') as day
, (select count(*) from apex_activity_log
where flow_id = t.flow_id
and time_stamp between t.day and t.day + 0.999) as cou
from
(
select flow_id, day from
(
select distinct flow_id from apex_activity_log where flow_id < 1000
),
(
select (select min(trunc(time_stamp)) from apex_activity_log) + level - 1 as day
from dual
connect by (select min(trunc(time_stamp)) from apex_activity_log) + level - 1 < (select max(trunc(time_stamp)) from apex_activity_log)
)
) t
order by t.flow_id, t.day
;

Всё, запрос готов. Строим Web интерфейс.

Создаем новую страницу:

Начало создания новой страницы
Начало создания новой страницы
Завершение создания новой страницы
Завершение создания новой страницы

На новой странице создаем новый регион. Регион - это с точки зрения пользователя область страницы, а с точки зрения разработчика - логический компонент программы. Выберем тип создаваемого региона - график (chart):

Создание региона
Создание региона

Как только мы объявили регион графиком, мы получаем сразу несколько предупреждений об отсутствии необходимых параметров:

Предупреждения о необходимых параметрах
Предупреждения о необходимых параметрах

Главная отсутствующая информация - это запрос. Мы его составили заблаговременно, скопируем:

SQL запрос для графика
SQL запрос для графика

Объясним машине, что сериями (столбцами, линиями, областями) на графике будут идентификаторы сайтов APP_ID, что аргументом (X) будет дата DAY, а функцией (Y) - счетчик COU:

Отображение результатов запроса на параметры графика
Отображение результатов запроса на параметры графика

Предупреждения пропали, можно сохранить работу и посмотреть результаты:

График с настройками по умолчанию
График с настройками по умолчанию

Сделаем график в виде линий:

Изменение вида графика
Изменение вида графика
Линейный график
Линейный график

А теперь - в виде сплайнов с областями:

Сплайны с областями
Сплайны с областями

Создание страницы заняло от силы 5 минут, при этом наибольшая часть времени ушла на SQL запрос.

Oracle APEX позволяет специалисту по базам данных очень быстро и без помощи Web программистов строить Web интерфейсы. Важно только понимать, что эта технология очень похожа на автомобиль с автоматической коробкой передач: ученик сел - и сразу тронулся, только успешное троганье с места не эквивалентно успешной езде. Самые простые случаи типа рассмотренного, действительно, требуют лишь здравого смысла и "английского со словарем", более-менее сложная разработка на Oracle APEX требует, все же, обучения.