Обработка иерархических данных
Иерархии — это важная часть всех решений бизнес-анализа, используемых для описания измерений, которые, разумеется, содержат различные уровни модульности. Одни из них просты и интуитивно понятны, тогда как другие сложны, и их моделирование требует значительных усилий.
От верхней до нижней части иерархии члены иерархии становятся более детализированными. Например, в измерении с уровнями «Рынок», «Страна», «Штат» или «Город» член «Америка» появляется на верхнем уровне иерархии, член «США» появляется на втором уровне, член «Калифорния» — на третьем, а «Сан-Франциско» — на нижнем уровне. «Калифорния» — более конкретное понятие, чем «США», а «Сан-Франциско» более конкретное, чем «Калифорния».
Сохранение иерархий в реляционной модели — это обычная задача со множеством решений. Существует несколько подходов:
- Горизонтальная иерархия
- Модель списка смежных вершин
- Способ перечисления путей
- Модель вложенных наборов
- Родительский список
В данном учебном пособии мы будем создавать родительский список, поскольку иерархия в нем представлена в том виде, который как раз используется в запросах. Дополнительную информацию о других подходах к решению данной задачи см. в разделе Qlik Community.
Префикс Hierarchy
Префикс Hierarchy является командой скрипта, которая ставится перед оператором LOAD или SELECT, который загружает таблицу со смежными узлами. У оператора LOAD должно быть как минимум три поля: идентификатор, который является уникальным ключом к узлу, ссылка на родителя и имя.
С помощью префикса загруженная таблица будет преобразована в таблицу расширенных узлов; таблицу с дополнительными столбцами, по одному для каждого уровня иерархии.
Выполните следующие действия.
- Создайте новое приложение и дайте ему имя.
- Добавьте новый раздел скрипта в Редакторе загрузки данных.
- Вызовите раздел Wine.
-
Под элементом DataFiles в меню справа щелкните Выбрать данные.
- Загрузите, а затем выберите Winedistricts.txt.
- В окне Выбор данных из снимите флажки для полей Lbound и RBound, чтобы не осуществлялась их загрузка.
- Щелкните команду Вставить скрипт.
- Введите следующее над оператором LOAD:
- Щелкните команду Загрузить данные.
- Используйте раздел Предварительный просмотр просмотра модели данных, чтобы просмотреть полученную таблицу.
- Все имена узлов находятся в одном и том же столбце, поэтому это можно использовать для поиска.
- Кроме того, различные уровни узлов были расширены так, что у каждого из них по одному полю; эти поля можно использовать в группах детализации или в качестве измерений в сводных таблицах.
- Кроме того, различные уровни узлов были расширены так, что у каждого из них по одному полю; эти поля можно использовать в группах детализации.
- Это можно сделать, чтобы указать путь, уникальный для каждого узла, с перечислением всех родителей в правильном порядке.
- Это можно сделать, чтобы указать глубину узла, т. е. расстояние от корневой папки.
Hierarchy (NodeID, ParentID, NodeName)
Скрипт должен выглядеть следующим образом:
Hierarchy (NodeID, ParentID, NodeName)
LOAD
NodeID,
ParentID,
NodeName
FROM [lib://DataFiles/Winedistricts.txt]
(txt, utf8, embedded labels, delimiter is '\t', msq);
Полученная таблица расширенных узлов имеет то же число записей, что и исходная таблица: по одной записи на узел. Таблица расширенных узлов очень практична, поскольку она отвечает ряду следующих требований для анализа иерархии в реляционной модели.
Полученная таблица выглядит следующим образом:
Префикс HierarchyBelongsTo
Как и префикс Hierarchy, префикс HierarchyBelongsTo представляет собой команду скрипта, которая помещается перед оператором LOAD или SELECT, загружающим таблицу со смежными узлами.
Также у оператора LOAD должно быть как минимум три поля: идентификатор, который является уникальным ключом к узлу, ссылка на родителя и имя. С помощью префикса загруженная таблица будет преобразована в родительскую таблицу, таблицу со всевозможными комбинациями родителя и потомка, указанными в виде отдельной записи. Таким образом, очень просто найти всех родителей или всех потомков определенного узла.
Выполните следующие действия.
- Измените оператор Hierarchy в редакторе загрузки данных, чтобы он выглядел так:
HierarchyBelongsTo (NodeID, ParentID, NodeName, BelongsToID, BelongsTo)
- Щелкните команду Загрузить данные.
- Используйте раздел Предварительный просмотр просмотра модели данных, чтобы просмотреть полученную таблицу.
- Если идентификатор узла представляет одиночные узлы, то идентификатор родителя представляет все дерево и поддеревья иерархии.
- Все имена узлов относятся одновременно к узлам и деревьям, и их можно использовать для поиска в обеих этих ролях.
- Это можно сделать, чтобы указать глубину разницы между глубиной узла и глубиной родителя, т. е. расстояние от корневой папки до поддерева.
Родительская таблица отвечает ряду требований для анализа иерархии в реляционной модели:
Полученная таблица выглядит следующим образом:
Авторизация
Довольно часто иерархия используется для авторизации. Одним из примеров является иерархия организационной структуры. Каждый менеджер имеет право видеть всю информацию, которая относится к его отделу, включая подчиненные отделы. Но менеджерам не обязательно видеть информацию, которая касается других отделов.
Это значит, что разные люди будут иметь доступ к разным поддеревьям организации. Таблица авторизации может выглядеть так:
ACCESS | NTNAME | PERSON | POSITION | PERMISSIONS |
---|---|---|---|---|
USER | ACME\JRL | John | CPO | HR |
USER | ACME\CAH | КэролCarol | Генеральный директор | Генеральный директор |
USER | ACME\JER | James | Director Engineering | Engineering |
USER | ACME\DBK | Diana | CFO | Финансовый |
USER | ACME\RNL | Bob | Исполнительный директор | Продажи |
USER | ACME\LFD | Larry | Технический директор | Продукт |
В этом случае Carol может видеть все, что относится к CEO и ниже; Larry может видеть организацию Product; а James может видеть только организацию Engineering.
Пример:
Нередко для хранения иерархии используется таблица смежных узлов. В этом примере для решения этой задачи можно загрузить таблицу смежных узлов при помощи HierarchyBelongsTo и присвоить родительскому полю имя Tree.
Для использования Section Access загрузите копию поля Tree и присвойте этому новому полю имя PERMISSIONS. И наконец, следует загрузить таблицу авторизации. Выполнить два последних шага можно с помощью следующих строк скрипта. Обратите внимание, что таблица TempTrees является таблицей, созданной оператором HierarchyBelongsTo.
Обратите внимание, что это просто пример. Здесь нет сопутствующих упражнений, которые следует выполнить в Qlik Sense.
В этом примере будет получена следующая модель данных: