При визуализации динамики во времени в Qlik распространено использование графиков с непрерывной осью измерения. Его основное преимущество — динамический масштаб, позволяющий уместить всю информацию с графика в том пространстве, которое под него выделено.


Однако, по умолчанию на непрерывной оси мы видим подписи в виде дней. Что не очень удобно на большом масштабе. Поэтому сегодня мы разберем, как выводить туда корректные наименования периодов, чтобы сделать наши отчеты еще удобнее.

Derived Fields
Создадим 2 визуализации: 2 графика с мерой sum(Платежи), с измерениями Дата и МесяцГод соответственно.

Чтобы получить красивые подписи на оси X, нужно сделать манипуляции на стороне скрипта. Разместите после генерации календаря этот код:
[AxisViz]:
DECLARE FIELD DEFINITION
FIELDS
Dual(Year($1), YearStart($1)) AS [Year] Tagged ('$axis'),
date(monthstart($1),'MMM') as Месяц Tagged ('$axis'),
date($1,'D') as День Tagged ('$axis');
DERIVE FIELDS FROM FIELDS [Дата] USING [AxisViz];

Разберем что он делает. Эта конструкция создает так называемое определение полей AxisViz — перечень формул и меток, которые могут быть применены к производльным полям модели данных.
$1 в данной конструкции — обозначение поля, к которому данные формулы будут применяться. Также, вы можете увидеть, что помимо задания меток полей идет присвоение тегов через команду tagged (). Эта команда работает только в таком режиме, ее нельзя исопльзовать внутри load. Тег $axis как раз отвечает за то, что результаты формулы будут интерпретироваться как метки для осей.
Финализируется эта штука командой DERIVE FIELDS, в которой указывается к каким полям эти формулы применяются.
Загрузим данные. Подписи оси X графика по дням стали красивыми. А вот график по месяцам по-прежнему с подписями дней. Но прежде чем разбираться с этим, посмотрим что еще изменилось в визуальном слое.

Посмотрим в список полей. Мы увидим, что у поля Дата появился календарь, а в нем — те самые вложенные измерения из Derived Fields. Если календарика нет — обновите страницу.

Возможно вы спросите, а может надо было сразу делать календарь вот так? В конце концов, при загрузке данных через Диспетчер данных календари формируются именно таким образом. Я вам на это отвечу, что использовать такие календари как измерения диаграмм не нужно. По двум причинам:
- У таких полей всегда длинные составные метки, типа Дата.AxisViz.Year. Красоты нашей аналитике они не добавят;
- В отличие от календаря который делали мы, derived fields — не настоящие поля модели данных. Их значения вычисляются динамически в визуальном слое, что приведет к снижению производительности при большом объеме данных.
Теперь, подкрутим наш код. Добавим derived-полям тег $hidden, чтобы они не отображались в визуальном слое. И допишем второе поле, МесяцГод, чтобы эти метки также применялись и к нему.
[AxisViz]:
DECLARE FIELD DEFINITION
FIELDS
Dual(Year($1), YearStart($1)) AS [Year] Tagged ('$axis','$hidden'),
date(monthstart($1),'MMM') as Месяц Tagged ('$axis','$hidden'),
date($1,'D') as День Tagged ('$axis','$hidden');
DERIVE FIELDS FROM FIELDS [Дата],[МесяцГод] USING [AxisViz];
Результат:

Как вы поняли, можно применять один и тот же набор derived-полей к нескольким полям модели данных.
Последовательность формул derived-полей важна, от нее зависит то в какой последовательности подписи будут стоять на диаграммах.
Для разных полей модели можно создавать разные наборы Derived-полей, что будет полезно для измерений, например, недель. Например, вот так размечаются подписи для разных периодов:

Результат:

Учитывайте, что для отображения derived-значения как подписи нужно, чтобы оно было типа Dual. Где текстовая часть отвечает за подпись, а числовая — за дату, к которой эта подпись относится. Например, если я хочу подписать месяцы в формате Дек 2020, то мне достаточно использовать функцию date(monthstart($1,’MMM YYYY’)). Т.к. функция date возвращает и числовое, и текстовое значение, т.е. является dual.
Но если я захочу сделать подпись вида число и день недели то конструкция будет такая:
dual(date($1,'D')&' '&weekday($1),date($1))
Потому что конструкция (date($1,’D’)&’ ‘&weekday($1) уже не является числом, и нужно с помощью Dual задать ей числовой эквивалент в виде даты, т.е. date($1).
Использовать Derived-поля в качестве измерений не надо.
Опечатки: неперерыной ,производльным , исопльзовать
Евгений, спасибо, всегда много нового и интересного.
Скажите, а можно отключить автоматически создаваемый скрипт с Derived-полями, чтобы не создавать кашу из своих календарных полей, своих derived-полей, а еще и автоматических?
Автоматические Derived поля вроде создаются при загрузке данных через Диспетчер, а не скрипт. При загрузке через скрипт Derived полей не будет, если вы их сами не создадите.