Manipulando dados hierárquicos
Hierarquias são uma parte importante de todas as soluções de business intelligence, utilizadas para descrever dimensões que obviamente contêm diferentes níveis de granularidade. Algumas são simples e intuitivas, enquanto outras são complexas e exigem bastante planejamento para serem corretamente modeladas.
Da parte superior de uma hierarquia até a parte inferior, os membros são progressivamente mais detalhados. Por exemplo, em uma dimensão que tenha os níveis Mercado, País, Estado e Cidade, o membro Américas aparece no nível mais alto da hierarquia, o membro EUA aparece no segundo nível, o membro Califórnia aparece no terceiro nível e São Francisco no nível inferior. Califórnia é mais específico do que EUA e São Francisco é mais específico do que Califórnia.
Armazenar hierarquias em um modelo relacional é um desafio comum com várias soluções. Há várias abordagens:
- A hierarquia Horizontal
- O modelo de lista de Adjacência
- O método de enumeração do Caminho
- O modelo de conjuntos Aninhados
- A lista de Ancestrais
Para os fins deste tutorial, criaremos uma lista de Ancestrais, já que ela apresenta a hierarquia de uma forma que pode ser utilizada diretamente em uma consulta. Mais informações sobre as outras abordagens podem ser encontradas no Qlik Community.
Prefixo Hierarchy
O prefixo Hierarchy é um comando de script que é colocado na frente de um comandoLOAD ou SELECT que carrega uma tabela de nós adjacentes. Também aqui, o comando LOAD precisa ter pelo menos três campos: Um ID que seja uma chave exclusiva do nó, uma referência ao pai e um nome.
O prefixo transformará uma tabela carregada em uma tabela de nós expandidos; uma tabela que tenha um número de colunas adicionais; uma para cada nível da hierarquia.
Faça o seguinte:
- Crie um novo aplicativo e nomeie-o.
- Adicione uma nova seção de script no Editor de carregamento de dados.
- Nomeie a seção como Wine.
-
Em DataFiles no menu direito, clique em Selecionar dados.
- Carregue e, em seguida, selecione Winedistricts.txt.
- Na janela Selecionar dados de, desmarque os campos Lbound e RBound para que não sejam carregados.
- Clique em Inserir script.
- Digite o seguinte acima do comando LOAD:
- Clique em Carregar dados.
- Use a seção Pré-visualização do visualizador do modelo de dados para visualizar a tabela resultante.
- Todos os nomes de nós existem em uma e na mesma coluna; portanto, ela pode ser utilizada para pesquisas.
- Além disso, os diferentes níveis de nós foram expandidos em um campo cada; campos que podem ser usados em grupos de hierarquia ou como dimensões em tabelas dinâmicas.
- Além disso, os diferentes níveis de nós foram expandidos em um campo cada; campos que podem ser usados em grupos detalhados.
- Ela pode ser criada para conter um caminho exclusivo para o nó, listando todos os ancestrais na ordem correta.
- Ela pode ser criada para conter a profundidade do nó, isto é, a distância da raiz.
Hierarchy (NodeID, ParentID, NodeName)
Seu script deve ter a seguinte aparência:
Hierarchy (NodeID, ParentID, NodeName)
LOAD
NodeID,
ParentID,
NodeName
FROM [lib://DataFiles/Winedistricts.txt]
(txt, utf8, embedded labels, delimiter is '\t', msq);
A tabela de nós expandidos resultante tem exatamente o mesmo número de registros que a sua tabela de origem: um por nó. A tabela de nós expandidos é muito prática, já que ela atende a alguns requisitos para a análise de uma hierarquia em um modelo relacional:
A tabela resultante tem a seguinte aparência:
Prefixo HierarchyBelongsTo
Assim como o prefixo Hierarchy, o prefixo HierarchyBelongsTo é um comando de script que é colocado na frente de um comando LOAD ou SELECT que carrega uma tabela de nós adjacentes.
Também aqui, o comando LOAD precisa ter pelo menos três campos: Um ID que seja uma chave exclusiva do nó, uma referência ao pai e um nome. O prefixo transformará a tabela carregada em uma tabela de ancestrais, uma tabela que tenha cada combinação de um ancestral e um descendente listado como um registro separado. Por isso, é muito fácil localizar todos os ancestrais ou todos os descendentes de um determinado nó.
Faça o seguinte:
- No Editor de carregamento de dados, modifique o comando Hierarchy para o seguinte:
HierarchyBelongsTo (NodeID, ParentID, NodeName, BelongsToID, BelongsTo)
- Clique em Carregar dados.
- Use a seção Pré-visualização do visualizador do modelo de dados para visualizar a tabela resultante.
- Se o ID do nó representar os nós individuais, o ID do ancestral representará as árvores inteiras e sub-árvores da hierarquia.
- Todos os nomes de nós existem na função como nós e na função como árvores e as duas podem ser utilizadas para pesquisas.
- Isso pode ser feito para conter a diferença de profundidade entre a profundidade do nó e a profundidade do ancestral, isto é, a distância entre a raiz da sub-árvore.
A tabela de ancestrais atende a vários requisitos para a análise de uma hierarquia em um modelo relacional:
A tabela resultante tem a seguinte aparência:
Autorização
Não é raro que uma hierarquia seja usada para autorização. Um exemplo é uma hierarquia organizacional. Cada gerente deve ter o direito de visualizar tudo o que pertence ao seu próprio departamento, incluindo todos os seus sub-departamentos. Mas eles não devem, necessariamente, ter o direito de visualizar os outros departamentos.
Isso significa que diferentes pessoas poderão visualizar diferentes sub-árvores da organização. A tabela de autorização pode ter a seguinte aparência:
ACCESS | NTNAME | PERSON | POSITION | PERMISSIONS |
---|---|---|---|---|
Usuário | ACME\JRL | John | CPO | HR |
Usuário | ACME\CAH | Carol | CEO | CEO |
Usuário | ACME\JER | James | Engenharia do Diretor | Engenharia |
Usuário | ACME\DBK | Diana | CFO | Financeiro |
Usuário | ACME\RNL | Bob | COO | Vendas. |
Usuário | ACME\LFD | Larry | CTO | Produto |
Neste caso, Carol pode visualizar tudo o que pertence ao CEO e outros; Larry pode visualizar a organização do Product; e James pode visualizar somente a organização Engineering.
Exemplo:
Muitas vezes, a hierarquia é armazenada em uma tabela de nós adjacentes. Neste exemplo, para resolver isso, você pode carregar a tabela de nós adjacentes usando um HierarchyBelongsTo e chamar o campo ancestralTree.
Se você quiser usar o Section Access, carregue uma cópia em maiúsculas de Tree e chame esse novo campo de PERMISSIONS. Por último, você precisa carregar a tabela de autorização. Essas duas últimas etapas podem ser realizadas usando as seguintes linhas de script. Observe que a tabela TempTrees é a tabela criada pelo comando HierarchyBelongsTo.
Observe que este é apenas um exemplo. Não há exercícios complementares a serem concluídos no Qlik Sense.
Este exemplo produziria o seguinte modelo de dados: