Cálculos adicionais de análise de tempo
Existem outras funções de análise de tempo DAX que devolvem uma única data. Vai aprender sobre estas funções ao aplicá-las em dois cenários diferentes.
As FIRSTDATE
funções e da LASTDATE
DAX devolvem a primeira e a última data no contexto de filtro atual para a coluna de datas especificada.
Calcular novas ocorrências
Outra utilização das funções de análise de tempo consiste em contabilizar novas ocorrências. O exemplo seguinte mostra como pode calcular o número de novos clientes de um período de tempo. Um novo cliente é contabilizado no período de tempo em que fez a primeira compra.
A sua primeira tarefa é adicionar a seguinte medida à tabela Vendas que conta o número de clientes distintos até à data (LTD). Desde sempre significa desde o começo dos tempos até à última data no contexto de filtro. Formate a medida como um número inteiro com o separador de milhares.
Customers LTD =
VAR CustomersLTD =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerKey]),
DATESBETWEEN(
'Date'[Date],
BLANK(),
MAX('Date'[Date])
),
'Sales Order'[Channel] = "Internet"
)
RETURN
CustomersLTD
Adicione a medida Clientes Desde Sempre ao elemento visual de matriz. Repare que esta produz um resultado de clientes distintos desde sempre até ao fim de cada mês.
A DATESBETWEEN
função devolve uma tabela que contém uma coluna de datas que começa com uma determinada data de início e continua até uma determinada data de fim. Quando a data de início está EM BRANCO, utiliza a primeira data na coluna de data. (Por outro lado, quando a data de fim está EM BRANCO, utiliza a última data na coluna de data.) Neste caso, a data de fim é determinada pela função MAX, que devolve a última data no contexto de filtro. Portanto, se o mês de agosto de 2017 estiver no contexto de filtro, a função MAX devolverá 31 de agosto de 2017 e a DATESBETWEEN
função devolverá todas as datas até 31 de agosto de 2017.
Em seguida, vai modificar a medida ao mudar o respetivo nome para Novos Clientes e adicionar uma segunda variável para armazenar a contagem de clientes distintos antes do período de tempo no contexto de filtro. A RETURN
cláusula subtrai agora este valor aos clientes LTD para produzir um resultado, que é o número de novos clientes no período de tempo.
New Customers =
VAR CustomersLTD =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerKey]),
DATESBETWEEN(
'Date'[Date],
BLANK(),
MAX('Date'[Date])
),
'Sales Order'[Channel] = "Internet"
)
VAR CustomersPrior =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerKey]),
DATESBETWEEN(
'Date'[Date],
BLANK(),
MIN('Date'[Date]) - 1
),
'Sales Order'[Channel] = "Internet"
)
RETURN
CustomersLTD - CustomersPrior
Para a variável CustomersPrior , repare que a DATESBETWEEN
função inclui datas até à primeira data no contexto de filtro menos uma. Uma vez que o Microsoft Power BI armazena internamente as datas como números, pode adicionar ou subtrair números para deslocar uma data.
Cálculos de instantâneo
Ocasionalmente, os dados de factos são armazenados como instantâneos no tempo. Os exemplos comuns incluem níveis de stock ou saldos de conta. Periodicamente, é carregado um instantâneo de valores na tabela.
Ao resumir valores de instantâneo (como os níveis de stock), pode resumir os valores em qualquer dimensão, com a exceção da data. A adição de contagens de níveis de stock em categorias de produtos produz um resumo significativo, mas a adição de contagens de níveis de stock entre datas não o faz. Adicionar o nível de stock de ontem ao nível de stock de hoje não é uma operação útil (a menos que queira calcular a média desse resultado).
Quando resume tabelas de instantâneos, as fórmulas de medida podem recorrer a funções de análise de tempo DAX para impor um único filtro de data.
No exemplo seguinte,vai explorar um cenário para a empresa Adventure Works. Mude para a vista de modelo e selecione o diagrama de modelo Inventário.
Repare que o diagrama mostra três tabelas: Produto, Data e Inventário. A tabela Inventário armazena instantâneos de saldos unitários para cada data e produto. É importante que a tabela não tenha datas em falta nem entradas duplicadas para um produto na mesma data. Além disso, o último registo de instantâneo está armazenado para a data de 15 de junho de 2020.
Agora, mude para a vista de relatório e selecione a Página 2 do relatório. Adicione a coluna UnitsBalance da tabela Inventário ao elemento visual de matriz. O resumo predefinido está configurado para somar valores.
Esta configuração visual é um exemplo de como não resumir um valor de instantâneo. Adicionar saldos diários de instantâneos não produz um resultado significativo. Sendo assim, remova o campo UnitsBalance do elemento visual de matriz.
Agora, irá adicionar uma medida à tabela Inventário que soma o valor UnitsBalancepara uma única data. A data será a última data de cada período de tempo. É conseguido com a LASTDATE
função . Formate a medida como um número inteiro com o separador de milhares.
Stock on Hand =
CALCULATE(
SUM(Inventory[UnitsBalance]),
LASTDATE('Date'[Date])
)
Nota
Repare que a fórmula de medida utiliza a SUM
função. Tem de ser utilizada uma função de agregação (as medidas não permitem referências diretas a colunas), mas dado que existe apenas uma linha para cada produto para cada data, a SUM
função só funcionará numa única linha.
Adicione a medida Stock Disponível ao elemento visual de matriz. O valor de cada produto baseia-se agora no último saldo de unidades registado para cada mês.
A medida devolve valores EM BRANCO para junho de 2020 porque não existe nenhum registo para a última data em junho. De acordo com os dados, esta ainda não ocorreu.
A filtragem pela última data no contexto de filtro tem problemas inerentes: Pode não existir uma data registada porque esta ainda não ocorreu ou talvez porque os saldos de stock não são registados aos fins de semana.
O próximo passo consiste em ajustar a fórmula de medida para determinar a última data que tem um resultado que não está EM BRANCO e, em seguida, filtrar por essa data. Pode realizar esta tarefa com a LASTNONBLANK
função DAX.
Utilize a definição de medida seguinte para modificar a medida Stock Disponível.
Stock on Hand =
CALCULATE(
SUM(Inventory[UnitsBalance]),
LASTNONBLANK(
'Date'[Date],
CALCULATE(SUM(Inventory[UnitsBalance]))
)
)
No elemento visual de matriz, repare nos valores de junho de 2020 e no total (que representa o ano inteiro).
A LASTNONBLANK
função é uma função iterador. Devolve a última data que produz um resultado que não está EM BRANCO. Alcança este resultado ao iterar em todas as datas no contexto de filtro por ordem cronológica descendente. (Por outro lado, os FIRSTNONBLANK
itera por ordem cronológica ascendente.) Para cada data, avalia a expressão transmitida em. Quando encontra um resultado que não está EM BRANCO, a função devolve a data. Essa data é então utilizada para filtrar a CALCULATE
função.
Nota
A LASTNONBLANK
função avalia a expressão no contexto de linha. A CALCULATE
função tem de ser utilizada para fazer a transição do contexto da linha para filtrar o contexto para avaliar corretamente a expressão.
Agora, deve ocultar a coluna UnitsBalance da tabela Inventário. Tal impedirá que os criadores do relatório resumam de forma inadequada os saldos de unidades de instantâneo.