# Обработка иерархических данных

Иерархии — это важная часть всех решений бизнес-анализа, используемых для описания измерений, которые, разумеется, содержат различные уровни модульности. Одни из них просты и интуитивно понятны, тогда как другие сложны, и их моделирование требует значительных усилий.

От верхней до нижней части иерархии члены иерархии становятся более детализированными. Например, в измерении с уровнями «Рынок», «Страна», «Штат» или «Город» член «Америка» появляется на верхнем уровне иерархии, член «США» появляется на втором уровне, член «Калифорния» — на третьем, а «Сан-Франциско» — на нижнем уровне. «Калифорния» — более конкретное понятие, чем «США», а «Сан-Франциско» более конкретное, чем «Калифорния».

Сохранение иерархий в реляционной модели — это обычная задача со множеством решений. Существует несколько походов:

* Горизонтальная иерархия
* Модель списка смежных вершин
* Способ перечисления путей
* Модель вложенных наборов
* Родительский список

В данном учебном пособии мы будем создавать родительский список, поскольку иерархия в нем представлена в том виде, который как раз используется в запросах. Дополнительную информацию о других подходах к решению данной задачи см. в разделе Qlik Community.

## Префикс Hierarchy

Префикс Hierarchy является командой скрипта, которая ставится перед оператором LOAD или SELECT, который загружает таблицу со смежными узлами. У оператора LOAD должно быть как минимум три поля: идентификатор, который является уникальным ключом к узлу, ссылка на родителя и имя.

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

Выполните следующие действия.

1. Создайте новое приложение и дайте ему имя.

2. Добавьте новый раздел скрипта в Редакторе загрузки данных.

3. Вызовите раздел Wine.

4. Под элементом DataFiles в меню справа щелкните Выбрать данные.

5. Загрузите, а затем выберите Winedistricts.txt.

6. В окне Выбор данных из снимите флажки для полей Lbound и RBound, чтобы не осуществлялась их загрузка.

7. Нажмите Добавить.

8. Введите следующее над оператором 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);			
   ```

9. Щелкните команду Загрузить данные.

10. Используйте раздел Предварительный просмотр просмотра модели данных, чтобы просмотреть полученную таблицу.

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

    * Все имена узлов находятся в одном и том же столбце, поэтому это можно использовать для поиска.
    * Кроме того, различные уровни узлов были расширены так, что у каждого из них по одному полю; эти поля можно использовать в группах детализации или в качестве измерений в сводных таблицах.
    * Кроме того, различные уровни узлов были расширены так, что у каждого из них по одному полю; эти поля можно использовать в группах детализации.
    * Это можно сделать, чтобы указать путь, уникальный для каждого узла, с перечислением всех родителей в правильном порядке.
    * Это можно сделать, чтобы указать глубину узла, т. е. расстояние от корневой папки.

    Полученная таблица выглядит следующим образом:

    Таблица, в которой отображаются данные образца, загруженные с помощью префикса Hierarchy

    Таблица, в которой отображаются данные образца, загруженные с помощью префикса Hierarchy

    Таблица, в которой отображаются данные образца, загруженные с помощью префикса HierarchyHierarchy ![Таблица, в которой отображаются данные образца, загруженные с помощью префикса Hierarchy.](https://help.qlik.com/ru-RU/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-hierarchyprefix-table.png)

## Префикс HierarchyBelongsTo

Как и префикс Hierarchy, префикс HierarchyBelongsTo представляет собой команду скрипта, которая помещается перед оператором LOAD или SELECT, загружающим таблицу со смежными узлами.

Также у оператора LOAD должно быть как минимум три поля: идентификатор, который является уникальным ключом к узлу, ссылка на родителя и имя. С помощью префикса загруженная таблица будет преобразована в родительскую таблицу, таблицу со всевозможными комбинациями родителя и потомка, указанными в виде отдельной записи. Таким образом, очень просто найти всех родителей или всех потомков определенного узла.

Выполните следующие действия.

1. Измените оператор Hierarchy в редакторе загрузки данных, чтобы он выглядел так:
   ```
   HierarchyBelongsTo (NodeID, ParentID, NodeName, BelongsToID, BelongsTo)
   ```

1) Щелкните команду Загрузить данные.
2) Используйте раздел Предварительный просмотр просмотра модели данных, чтобы просмотреть полученную таблицу.

   Родительская таблица отвечает ряду требований для анализа иерархии в реляционной модели:
   * Если идентификатор узла представляет одиночные узлы, то идентификатор родителя представляет все дерево и поддеревья иерархии.
   * Все имена узлов относятся одновременно к узлам и деревьям, и их можно использовать для поиска в обеих этих ролях.
   * Это можно сделать, чтобы указать глубину разницы между глубиной узла и глубиной родителя, т. е. расстояние от корневой папки до поддерева.

   Полученная таблица выглядит следующим образом:

   Таблица, в которой отображаются данные, загруженные с помощью префикса HierarchyBelongsTo

   Таблица, в которой отображаются данные, загруженные с помощью префикса HierarchyBelongsTo

   Таблица, в которой отображаются данные, загруженные с помощью префикса HierarchyBelongsToHierarchyBelongsTo ![Таблица, в которой отображаются данные, загруженные с помощью префикса HierarchyBelongsTo.](https://help.qlik.com/ru-RU/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-hierarchybelongsto-table.png)

### Авторизация

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

Пример иерархии организационной структуры

Пример иерархии организационной структуры

Пример иерархии организационной структуры ![](https://help.qlik.com/ru-RU/cloud-services/Subsystems/Hub/Content/Resources/Images/ex_gen_Authorization1.png)

Это значит, что разные люди будут иметь доступ к разным поддеревьям организации. Таблица авторизации может выглядеть так:

Таблица авторизации

| ACCESS | NTNAME | ЛИЦО | Позиция | Разрешения |
| --- | --- | --- | --- | --- |
| USER | ACME\JRL | John | Директор по продукту | Отдел кадров |
| USER | ACME\CAH | КэролCarol | Генеральный директор | Генеральный директор |
| USER | ACME\JER | Джеймс | Директор по инженерии | Инженерный отдел |
| USER | ACME\DBK | Диана | Финансовый директор | Финансовый |
| USER | ACME\RNL | Bob | Исполнительный директор | Продажи |
| USER | ACME\LFD | Ларри | Технический директор | Продукт |

В этом случае Carol может видеть все, что относится к CEO и ниже; Larry может видеть организацию Product; а James может видеть только организацию Engineering.

Пример:

Нередко для хранения иерархии используется таблица смежных узлов. В этом примере для решения этой задачи можно загрузить таблицу смежных узлов при помощи HierarchyBelongsTo и присвоить родительскому полю имя Tree.

Для использования Section Access загрузите копию поля Tree и присвойте этому новому полю имя PERMISSIONS. И наконец, следует загрузить таблицу авторизации. Выполнить два последних шага можно с помощью следующих строк скрипта. Обратите внимание, что таблица TempTrees является таблицей, созданной оператором HierarchyBelongsTo.

Обратите внимание, что это просто пример. Здесь нет сопутствующих упражнений, которые следует выполнить в Qlik Sense.

Trees: LOAD \*, Upper(Tree) as PERMISSIONS Resident TempTrees; Drop Table TempTrees; Section Access; Authorization: LOAD ACCESS, NTNAME, UPPER(Permissions) as PERMISSIONS From Organization; Section Application;

В этом примере будет получена следующая модель данных:

Модель данных: Таблицы Authorization, Trees, Fact и Nodes

Модель данных: Таблицы Authorization, Trees, Fact и Nodes

Модель данных: Таблицы AuthorizationAuthorization, TreesTrees, FactFact и NodesNodes ![Модель данных: таблицы Authorization, Trees, Fact и Nodes.](https://help.qlik.com/ru-RU/cloud-services/Subsystems/Hub/Content/Resources/Images/ex_gen_Authorization3.png)