Escolar Documentos
Profissional Documentos
Cultura Documentos
AVANÇADO
Índice
Power Query (tratamento de dados)
Modelagem de dados
• Introdução a Linguagem
o Visão Geral
o Expressões e Valores
o Evaluation
o Funções
• Vocábulos da Linguagem
o Convenções Gramaticais
o Comentários
o Tokens
• Conceitos Básicos
o Ambiente e Variáveis
o Ordem de Avaliação
o Princípio da Imutabilidade
• Tipos de Valores
o Nulo, Lógico, Tempo, Data, Duração, Texto, Binário
• Tipos de Objetos
o Lista, Registro,Tabela, Binário
• Operadores
• Condicionais
• Funções
o Escrever, Invocar
• Manipulação de Erros
Avançando em DAX:
• Variáveis no DAX
• Tabelas Virtuais em DAX com as funções: FILTER, SUMMARIZE, CROSSJOIN,
GENERATE, UNION, INTERSECT e EXCEPT
• Trabalhando com Hierarquias
• Inteligência de Tempo Avançada
• Análise de Propagação de Filtros e relacionamento bidirecional
• Contexto de Filtro Avançado
• Performance em DAX:
o Otimização da Performance em DAX
• Como Funciona a VertiPaq Engine
• Como Trabalhar com Muitos Dados
o Técnicas de Otimização
Power Query (tratamento de dados)
• Introdução às funções da linguagem M do Power Query
Uma função é definida e invocada no corpo de uma instrução let . As saídas sempre
ocorrem após a instrução in. Os parâmetros e/ou o valor de retorno podem ser
implícitos ou explícitos. Para adicionar comentários utiliza-se a barra dupla //
Expressões
Funções
Uma função por sua vez é um valor que, quando invocado com argumentos, produz
um novo valor. Trata-se de um valor como um número ou um valor de texto e pode
ser incluído em linha, assim como qualquer outra expressão. Quando uma função é
chamada (invocada), um conjunto de valores é especificado, que são substituídos
logicamente pelo conjunto necessário de valores de entrada dentro da expressão do
corpo da função.
• Criando Funções Personalizadas no M
Exemplo:
Notas:
Modelagem de dados
• Técnicas de Normalização de Dados
A normalização de dados é uma série de passos que se segue no projeto de uma base
de dados que permite um armazenamento consistente e um eficiente acesso aos dados
numa base de dados relacional. Esses dados reduzem a redundância de dados e as
possibilidades dos dados se tornarem inconsistentes.
A normalização de uma tabela na 1ª Forma Normal (1FN) exige que a tabela tenha
uma estrutura bidimensional correta, ou seja, cada linha deve corresponder a um só
registro e cada coluna a um só campo.
Além disso, cada campo deve conter dados atômicos, ou seja, um só dado por cada
registro. Cada dado só deve tomar um valor dentro do domínio definido para esse
campo.
A 2ª Forma Normal diz que a tabela tem de estar na 1FN e que cada atributo não
chave tem de ser funcionalmente dependente da totalidade da chave primária e não
apenas de uma parte dessa chave.
Assim depois de identificarmos a chave primária de uma tabela, pode dar-se um dos
dois casos:
A 3ª Forma Normal (3FN) diz que a tabela tem de estar na 2FN e que nenhum atributo
não chave pode depender funcionalmente de algum outro atributo que não seja a chave
primária.
Portanto, para normalizar uma tabela de acordo com a 3FN, devemos analisar todos os
atributos não chave e verificar se existem algumas dependências funcionais entre eles:
Assim que se tem a base dos tipos de chaves a serem usados no projeto de um banco
de dados, torna-se necessário saber como os relacionamentos de tabelas serão
estabelecidos.
• Relacionamento de 1 para 1;
• Relacionamento de 1 para N ou de N para 1 quando for o caso;
• Relacionamento de N para N.
SETOR
1 CONTRATO N EMPREGADOS
ESQUEMA ESTRELA
Dimensão
Dimensão Dimensão
Fato
Dimensão Dimensão
ESQUEMA SNOWFLAKE
Dimensão
Dimensão Dimensão
Fato
Dimensão Dimensão
Dimensão
• Conceito e aplicação de funções DAX
o SWITCH
Avalia uma expressão em relação a uma lista de valores e retorna uma das várias
expressões de resultado possíveis.
Sintaxe:
SWITCH(<expression>, <value>, <result>[, <value>, <result>]…[, <else>])
Parâmetros
expression Qualquer expressão DAX que retorne um
único valor escalar, em que a expressão
deve ser avaliada várias vezes (para
cada linha/contexto).
value Um valor constante a ser correspondido
com os resultados da expressão.
result Qualquer expressão escalar a ser
avaliada se os resultados
da expressão corresponderem ao valor
correspondente.
else Qualquer expressão escalar a ser
avaliada se o resultado
da expressão não corresponder a nenhum
dos argumentos de
Retorno
Um valor escalar proveniente de uma das expressões de resultado , se houver
uma correspondência com o valor ou da expressão else , se não houver nenhuma
correspondência com nenhum valor.
o VALUES
Sintaxe:
VALUES(<TableNameOrColumnName>)
Parâmetros
TableName or ColumnName Uma coluna da qual os valores
exclusivos devem ser retornados ou uma
tabela da qual as linhas devem ser
retornadas.
Retorno
Quando o parâmetro de entrada é um nome de coluna, uma única tabela de
coluna. Quando o parâmetro de entrada é um nome de tabela, uma tabela das mesmas
colunas é retornada.
o CALCULATE
Sintaxe:
CALCULATE(<expression>,<filter1>,<filter2>…)
Parâmetros
expression A expressão a ser avaliada.
filter1, filter2,... adicional Uma lista separada por
vírgulas de expressão booleana ou uma
expressão de tabela que define um
filtro.
Retorno
O valor que é o resultado da expressão.
o FILTER
Sintaxe:
FILTER(<table>,<filter>)
Parâmetros
table A tabela a ser filtrada. A tabela
também pode ser uma expressão que
resulta em uma tabela.
filter Uma expressão booleana a ser avaliada
para cada linha da tabela. Por
exemplo,[Resultado] > 0 ou [Instrutor]
= "Valdir"
Retorno
Uma tabela que contém apenas as linhas filtradas.
o RELATEDTABLE
Sintaxe:
RELATEDTABLE(<tableName>)
Parâmetros
tableName O nome de uma tabela existente usando
a sintaxe DAX padrão. Não pode ser uma
expressão.
Retorno
Uma tabela de valores
o HASONEVALUE
Sintaxe:
HASONEVALUE(<columnName>)
Parâmetros
columnName O nome de uma coluna existente, usando
a sintaxe DAX padrão. Não pode ser uma
expressão.
Retorno
True quando o contexto para ColumnName tiver sido filtrado para apenas um valor
distinto. Caso contrário, será false.
o RANKX
Sintaxe:
RANKX(<table>, <expression>[, <value>[, <order>[, <ties>]]])
Parâmetros
table Qualquer expressão DAX que retorna uma
tabela de dados sobre a qual a
expressão é avaliada.
expression Qualquer expressão DAX que retorne um
único valor escalar. A expressão é
avaliada para cada linha da tabela, a
fim de gerar todos os valores possíveis
para classificação.
value Adicional Qualquer expressão DAX que
retorna um valor escalar único cuja
classificação deve ser
encontrada. Quando o parâmetro Value é
omitido, o valor da expressão na linha
atual é usado.
order Adicional Um valor que especifica como classificar valor, baixo
para alto ou alto para baixo:
0 (Ou FALSE) Classifica em ordem decrescente de valores de
expressão. Se value for igual ao número mais alto
na expressão, RANKX retornará 1. Esse é o valor
padrão quando o parâmetro Order é omitido.
1 (Ou TRUE) Classifica em ordem crescente de expressão. Se
value for igual ao número mais baixo na expressão,
RANKX retornará 1.
ties Adicional Uma enumeração que define como determinar a
classificação quando há empates.
Retorno
O número de classificação do valor entre todos os valores possíveis
da expressão avaliada para todas as linhas de números de tabela .
o TOPN
Sintaxe:
TOPN(<n_value>,<table>,<orderBy_expression>,[<order>[,<orderBy_expression>,
[<order>]]…])
Parâmetros
n_value O número de linhas a serem
retornadas. É qualquer expressão DAX
que retorne um único valor escalar, em
que a expressão deve ser avaliada
várias vezes (para cada
linha/contexto).
table Qualquer expressão DAX que retorna uma
tabela de dados de onde extrair as
principais “n” linhas.
orderBy_expression Qualquer expressão DAX em que o valor
de resultado é usado para classificar
a tabela e é avaliada para cada linha
da tabela.
order Adicional Um valor que especifica como classificar
orderBy_expression valores, crescente ou decrescente:
0 (Ou FALSE) Classifica em ordem decrescente de valores
de order_by. Esse é o valor padrão quando o
parâmetro Order é omitido.
1 (Ou TRUE) Classifica em ordem crescente de order_by.
Retorno
Uma tabela com as “n” linhas superiores da tabela ou uma tabela vazia
se n_value for 0 (zero) ou menos. As linhas não são necessariamente
classificadas em nenhuma ordem específica.
o SUMMARIZECOLUMNS
Sintaxe:
SUMMARIZECOLUMNS(<groupBy_columnName>[,<groupBy_columnName>]…,[<filterTable>]
…[, <name>, <expression>]…)
Parâmetros
groupBy_columnName Uma referência de coluna totalmente
qualificada (tabela [coluna]) para uma
tabela base para a qual os valores
distintos são incluídos na tabela
retornada. Cada coluna de
groupBy_columnName é unida cruzada
(tabelas diferentes) ou de existência
automática (mesma tabela) com as colunas
especificadas subsequentes.
filterTable Uma expressão de tabela que é adicionada
ao contexto de filtro de todas as colunas
especificadas como argumentos de
groupBy_columnName. Os valores presentes
na tabela de filtro são usados para filtrar
antes da junção cruzada/a existência
automática é executada.
name Uma cadeia de caracteres que representa o
nome da coluna a ser usada para a expressão
subsequente especificada.
expression. Uma cadeia de caracteres que representa o
nome da coluna a ser usada para a expressão
subsequente especificada.
Retorno
Uma tabela que inclui combinações de valores das colunas fornecidas, com base
no Agrupamento especificado. Somente as linhas para as quais pelo menos uma das
expressões fornecidas retornam um valor não em branco são incluídas na tabela
retornada. Se todas as expressões forem avaliadas como em branco/NULL para uma
linha, essa linha não será incluída na tabela retornada.
o GROUPBY
Não faz um cálculo implícito para nenhuma coluna de extensão que ele
adiciona. GROUPBY permite que uma nova função, CURRENT (), seja usada dentro das
funções de agregação nas colunas de extensão que ele adiciona. GROUPBY tenta
reutilizar os dados que foram agrupados, tornando-os altamente com desempenho.
Sintaxe:
GROUPBY (<table>, [<groupBy_columnName1>], [<name>, <expression>]… )
Parâmetros
table Qualquer expressão DAX que retorne uma
tabela de dados.
groupBy_columnName O nome de uma coluna existente na tabela
(ou em uma tabela relacionada) pela qual
os dados serão agrupados. Esse parâmetro
não pode ser uma expressão.
name O nome dado a uma nova coluna que está
sendo adicionada à lista de colunas
GroupBy, entre aspas duplas.
expression. Qualquer expressão DAX que retorne um
único valor escalar, em que a expressão
deve ser avaliada para cada conjunto de
valores GroupBy.
Retorno
Uma tabela com as colunas selecionadas para os argumentos de groupBy_columnName
e agrupadas por colunas designadas pelos argumentos de nome.
o CROSSFILTER
Especifica a direção de filtragem cruzada a ser usada em um cálculo para uma relação
existente entre duas colunas.
Sintaxe:
CROSSFILTER(<columnName1>, <columnName2>, <direction>)
Parâmetros
columnName1, columnName2 Nome de colunas existentes, usando a
sintaxe DAX padrão e totalmente
qualificada, que geralmente representa
o lado muitos da relação a ser usada;
Se os argumentos forem fornecidos na
ordem inversa, a função os trocará
antes de usá-los. Este argumento não
pode ser uma expressão.
direction A direção do filtro cruzado a ser
usada.
Retorno
A função não retorna nenhum valor; a função define apenas a direção de filtragem
cruzada para a relação indicada, para a duração da consulta.
o DATESBETWEEN
Retorna uma tabela que contém uma coluna de datas que começa com
a start_date e continua até a end_date.
Sintaxe:
DATESBETWEEN(<dates>,<start_date>,<end_date>)
Parâmetros
Dates Uma referência a uma coluna de
data/hora.
Start date Uma expressão de data.
End date Uma expressão de data.
Retorno
Uma tabela que contém uma única coluna de valores de data.
o DATESINPERIOD
Retorna uma tabela que contém uma coluna de datas que começa com o start_date e
continua para o number_of_intervals especificado.
Sintaxe:
DATESINPERIOD(<dates>,<start_date>,<number_of_intervals>,<interval>)
Parâmetros
Dates Uma coluna que contém datas.
Start date Uma expressão de data.
Number_of_intervals Um inteiro que especifica o número de
intervalos a serem adicionados ou
subtraídos das datas.
Interval O intervalo pelo qual deslocar as
datas. O valor de Interval pode ser um
dos seguintes: year, quarter, month, day
Retorno
Uma tabela que contém uma única coluna de valores de data.
Para análise de performance de funções DAX podemos utilizar o DAX Studio. Podemos
utilizar apenas funções de tabela. Logo, para avaliarmos demais funções DAX, devemos
tratá-las utilizando a seguinte expressão:
o Visão Geral
o Expressões e Valores
Sintaxe
let
<expressão 1>,
<expressão 2>,
...
<expressão n>
in
Valor
o Funções
Lista de funções M
=#shared
Exemplo:
• Vocábulos da Linguagem
o Convenções Gramaticais
Linguagem CaseSensitive
Quebra de linha: ,
o Comentários
Tipo Literal
Null null
Logical true, false
Number 1, 1.2, 1.2e-3, #infinity, #nan
Text “Hello world!”
Date #date(2019, 3, 8)
Time #time(15, 10, 0)
DateTime #datetime(2019, 3, 8, 15, 10, 0)
DateTimeZone #datetimezone(2019, 3, 8, 15, 10, 0, -8, 0)
Duration #duration(1, 13, 59, 12)
• Tipos de Objetos
Categorias de função
Categorias
Binária Data e Hora Linhas
Combinação Data, hora e fuso horário Tabelas
Tipo Duração Record
Substituição Tratamento de erros Numérica
Data Uri Texto
Separação Listas Lógica
• Operadores
Lista de operadores M:
Operador Descrição
Sintaxe
if <teste lógico> then
<expressão 1>
else
<expressão 2>
• Funções
o Escrever, Invocar
Clique em Ok.
• Manipulação de Erros
Um erro é a indicação que o processo de validação de uma expressão não pode produzir
um valor.
Erros são apresentados pelos operadores e funções que se deparam com uma condição
de erro ou então usando uma expressão de erro. Erros são tratados usando a expressão
‘try’ e quando são apresentados, um valor é especificado, que pode ser usado para
indicar por que o erro ocorreu. Veja o exemplo a seguir:
Tratamento de erro
try error "negative unit count" otherwise 41
Notas:
Avançando em DAX:
• Variáveis no DAX
Sintaxe
Medida =
var Nome1 =
<expressão 1>
var Nome2 =
<expressão 2>
...
var NomeN =
<expressão N>
return
função(<expressão 1>,<expressão 2>,...,<expressão N>)
o FILTER
Sintaxe:
FILTER(<table>,<filter>)
Parâmetros
table A tabela a ser filtrada. A tabela
também pode ser uma expressão que
resulta em uma tabela.
filter Uma expressão booleana a ser avaliada
para cada linha da tabela. Por
exemplo,[Resultado] > 0 ou [Instrutor]
= "Valdir"
Retorno
Uma tabela que contém apenas as linhas filtradas.
o SUMMARIZE
Sintaxe:
SUMMARIZE(<table>, <groupBy_columnName>[, <groupBy_columnName>]…[, <name>,
<expression>]…)
Parâmetros
table Qualquer expressão DAX que retorne uma
tabela de dados.
groupBy_columnName Adicional O nome qualificado de uma
coluna existente a ser usada para criar
grupos de resumo com base nos valores
encontrados nele. Esse parâmetro não
pode ser uma expressão.
name O nome fornecido a uma coluna total ou
de resumo, entre aspas duplas.
expression Qualquer expressão DAX que retorne um
único valor escalar, em que a expressão
deve ser avaliada várias vezes (para
cada linha/contexto).
Retorno
Uma tabela com as colunas selecionadas para os argumentos
de groupBy_columnName e as colunas resumidas projetadas pelos argumentos de
nome.
o CROSSJOIN
Retorna uma tabela que contém o produto cartesiano de todas as linhas de todas as
tabelas nos argumentos. As colunas na nova tabela são todas as colunas em todas as
tabelas de argumentos.
Sintaxe:
CROSSJOIN(<table>, <table>[, <table>]…)
Parâmetros
table Qualquer expressão DAX que retorne uma
tabela
Retorno
Uma tabela que contém o produto cartesiano de todas as linhas de todas as
tabelas nos argumentos.
o GENERATE
Retorna uma tabela com o produto cartesiano entre cada linha na tabela1 e a tabela
que resulta da avaliação de Table2 no contexto da linha atual de Table1.
Sintaxe:
GENERATE(<table1>, <table2>)
Parâmetros
table1 Qualquer expressão DAX que retorne uma
tabela
Table2 Qualquer expressão DAX que retorne uma
tabela
Retorno
Uma tabela com o produto cartesiano entre cada linha na tabela1 e a tabela que
resulta da avaliação de Table2 no contexto da linha atual da tabela1
o UNION
Sintaxe:
UNION(<table_expression1>, <table_expression2> [,<table_expression>]…)
Parâmetros
table_expression Qualquer expressão DAX que retorne uma
tabela
Retorno
Uma tabela que contém todas as linhas de cada uma das duas expressões de tabela.
o INTERSECT
Sintaxe:
INTERSECT(<table_expression1>, <table_expression2>)
Parâmetros
table_expression Qualquer expressão DAX que retorne uma
tabela
Retorno
Uma tabela que contém todas as linhas em table_expression1 que também estão em
table_expression2
o EXCEPT
Sintaxe:
EXCEPT(<table_expression1>, <table_expression2>)
Parâmetros
table_expression Qualquer expressão DAX que retorne uma
tabela
Retorno
Uma tabela que contém as linhas de uma tabela menos todas as linhas de outra
tabela.
o PATH
Sintaxe:
PATH(<ID_columnName>, <parent_columnName>)
Parâmetros
ID_columnName O nome de uma coluna existente que
contém o identificador exclusivo para
linhas na tabela. Não pode ser uma
expressão. O tipo de dados do valor
em ID_columnName deve ser texto ou
inteiro e também deve ser o mesmo tipo
de dados que a coluna referenciada
em parent_columnName.
parent_columnName O nome de uma coluna existente que
contém o identificador exclusivo para
o pai da linha atual. Não pode ser uma
expressão. O tipo de dados do valor no
tipo de dados parent_columnName deve
ser texto ou inteiro e deve ser o mesmo
tipo de dados que o valor
em ID_columnName.
Retorno
Uma cadeia de caracteres de texto delimitada que contém os identificadores de
todos os pais para o identificador atual.
• Inteligência de Tempo Avançada
o PARALLELPERIOD
Retorna uma tabela que contém uma coluna de datas que representa um período
paralelo às datas na coluna datas especificadas, no contexto atual, com as datas
deslocadas para um número de intervalos que são encaminhados no tempo ou de
volta no tempo.
Sintaxe:
PARALLELPERIOD(<dates>,<number_of_intervals>,<interval>)
Parâmetros
dates Uma coluna que contém datas.
number_of_intervals Um inteiro que especifica o número de
intervalos a serem adicionados ou
subtraídos das datas.
interval O intervalo pelo qual deslocar as
datas. O valor de Interval pode ser um
dos seguintes: year, quarter, month.
Retorno
Uma tabela que contém uma única coluna de valores de data.
o DATEADD
Retorna uma tabela que contém uma coluna de datas, deslocada para frente ou para
trás no tempo pelo número especificado de intervalos a partir das datas no contexto
atual.
Sintaxe:
DATEADD(<dates>,<number_of_intervals>,<interval>)
Parâmetros
dates Uma coluna que contém datas.
number_of_intervals Um inteiro que especifica o número de
intervalos a serem adicionados ou
subtraídos das datas.
interval O intervalo pelo qual deslocar as
datas. O valor de Interval pode ser um
dos seguintes: year, quarter, month e
day.
Retorno
Uma tabela que contém uma única coluna de valores de data.
o DATEINPERIOD
Retorna uma tabela que contém uma coluna de datas que começa com
o start_date e continua para o number_of_intervals especificado.
Sintaxe:
DATESINPERIOD(<dates>,<start_date>,<number_of_intervals>,<interval>)
Parâmetros
dates Uma coluna que contém datas.
start_date Uma expressão de data.
number_of_intervals Um inteiro que especifica o número de
intervalos a serem adicionados ou
subtraídos das datas.
interval O intervalo pelo qual deslocar as
datas. O valor de Interval pode ser um
dos seguintes: year, quarter, month e
day.
Retorno
Uma tabela que contém uma única coluna de valores de data.
Para habilitar a filtragem cruzada, na caixa de diálogo Editar Relação de uma relação,
selecione o seguinte:
O DAX otimizado fornece informações detalhadas, lançando uma nova luz sobre dados
complexos. O DAX ineficiente reduz o tempo de processamento, obstrui a capacidade
premium, aumenta o tempo de espera e dificulta a atualização e o tempo de
carregamento do relatório.
Mecanismo de fórmula: sempre que uma nova solicitação vem do cliente, apesar do
DAX / MDX, do Analysis Services, ele é analisado e transformado em planos de consulta
e, finalmente, executado pelo mecanismo de fórmula.
Vertipaq Engine
Cada valor em uma coluna mapeada no valor inteiro de 32 bits. Esse mapeamento é
feito de duas maneiras. Codificação hash ou codificação de valor. A codificação de valor
usa cálculo matemático dinâmico para converter o valor real em valor inteiro de 32
bits. A codificação de hash sempre usa um novo valor para armazenar durante a
conversão. Esse valor de 32 bits compactado antes de ser armazenado na estrutura
colunar. Usando RLE ou codificação de comprimento de execução, classifique esses
valores antes de armazenar; valores semelhantes em colunas obterão um nível mais
alto de compactação.
• Como Trabalhar com Muitos Dados
• Técnicas de Otimização
Notas:
Roteiro de aula
Aula1
Power Query (Tratamento de dados)
Aula2
Modelagem de Dados
Linguagem DAX
Aula3
Linguagem DAX
Linguagem M
Aula4
Avançando em DAX
Aula5
Avançando em DAX
Revisão