Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

Neste tutorial, veremos uma parte do código DAX. Você já deve ter usado algo assim. Ou você pode encontrá-lo e ficar confuso sobre como esse código funciona e como o Contexto de linha e o Contexto de filtro parecem estar interagindo entre si em apenas um único código DAX. De qualquer forma, este tutorial examinará todos os itens acima em detalhes. Você pode assistir ao vídeo completo deste tutorial na parte inferior deste blog.

Primeiro, vamos olhar para o próprio código. Em seguida, passaremos pela parte teórica para entendê-la melhor. Por fim, veremos tudo nos bastidores usando o DAX Studio .

O modelo de dados que vamos usar é basicamente um modelo de dados de vendas simples que contém Datas, Vendas e a tabela Produtos. A tabela Vendas contém transações para cada dia. A tabela Produtos contém informações sobre as vendas dos produtos em cada dia. A tabela Dates contém apenas algumas colunas para este tutorial.

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

Estamos interessados ​​apenas na tabela Dates, mas vamos usar a tabela Sales e a tabela Products para explicar como o contexto do filtro e o contexto da linha se propagam com a ajuda de relacionamentos.

Índice

Contexto de linha e contexto de filtro em uma medida total em execução

Agora, vamos criar uma medida total em execução porque ela contém contextos de linha e filtro. Esta é uma medida total básica em execução, onde uso COUNTROWS sobre FILTER e a função ALL para retornar todos os anos que tenho dentro da tabela Date. Quando trago essa medida para dentro da tabela abaixo, vocês podem ver que conseguimos o resultado que esperamos.

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

Agora vamos tentar analisar como esse código DAX está funcionando.

Na medida, você pode ver que primeiro temos COUNTROWS, mas essa não é a primeira função que está sendo avaliada ou executada. Então, temos a função FILTER e depois a ALL. A primeira coisa na ordem de avaliação é de ALL. ALL retorna todos os valores exclusivos do Número do ano civil de datas, ignorando qualquer contexto de filtro que exista fora da função ALL.

Portanto, nas métricas, temos a coluna Número do ano civil e ela está filtrando ativamente essa coluna. Mas como ALL vai ignorar o contexto de filtro existente, vamos obter todos os valores exclusivos dessa coluna.

No segundo argumento, no contexto da linha, escrevemos que o número do ano civil de datas deve ser menor que o número do ano civil de datas MAX. Agora, se você é iniciante e ainda está tentando entender e aprender DAX, pode pensar que tanto as referências do lado esquerdo quanto dentro da função MAX pertencem à mesma coluna e são a mesma tabela que temos dentro do TODA função.

Mas isso não é verdade. A única parte do contexto da linha que pertence à função ALL é aquela que temos no lado esquerdo. O que temos no MAX está sendo avaliado dentro de um contexto de filtro e não no contexto de linha.

Assim, FILTER tenta criar um contexto de linha na tabela que você fornece no primeiro argumento, e essa parte do código é realmente recuperada desse contexto de linha específico. Então, cada linha, FILTER itera aquela tabela que temos dentro de ALL, e então podemos acessar todos os valores que estamos iterando no momento.

Assim, na primeira iteração, temos apenas um valor. Na segunda iteração, temos o segundo valor. Mas quando escrevemos MAX, é independente do contexto de linha que estamos criando usando a função FILTER. Portanto, MAX está sendo avaliado no contexto do filtro que está sendo criado pelo Número do ano atual que usamos nessa matriz.

Quando estivermos em 2006, MAX retornará 2006, enquanto a linha atual pode ser 2006, 2007 ou 2008. FILTER retornará a tabela que atende aos critérios que estamos especificando no segundo argumento. Quando passarmos para 2007, MAX retornará 2007. Em 2008, retornará 2008. E dependendo de todos os valores menores que o valor retornado pela função MAX, FILTER retornará um mesa.

Para provar que MAX não depende do contexto de linha, podemos segregar essa parte do código DAX em várias variáveis. E então, poderemos entender que as referências das colunas do lado esquerdo e do lado direito não são iguais.

Então, vamos criar uma variável.

Como você pode ver na medida abaixo, criei três variáveis ​​( ). Em seguida, adicionei o código FILTER por último com uma variável Result que usa COUNTROWS . Quando eu usar essa medida na tabela abaixo, você verá que nada muda. Os resultados ainda são os mesmos. Ainda obtemos o mesmo total acumulado que obtínhamos anteriormente.

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

Se voltarmos ao código e tentarmos recuperar o valor da primeira variável e confirmarmos isso, você pode ver que para cada linha, obtemos o mesmo ano.

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

Espero ter conseguido explicar a você que a função MAX, neste código em particular, não depende do contexto real para seus valores. E se você quiser simplificar sua compreensão do contexto de avaliação, sempre poderá dividir o código em várias variáveis ​​para entender a ordem de avaliação e como o código está sendo executado.

Agora, quero mostrar um cenário em que a função MAX dependerá do contexto de linha criado pela função FILTER.

Então, vamos voltar a essa medida. Vamos duplicar isso e, em vez de Last Visible Year, terei MAX Dates Calendar Year Number. Quando eu trago isso para a matriz, você pode ver que ficamos em branco.

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

Por que?

O fato é que estamos iterando todos os anos e o que CALCULATE faz é converter a linha atualmente iterada em um contexto de filtro equivalente.

Se eu escrever um sinal de igual aqui, você pode ver que temos sete, sete e sete.

Por que?

Deixe-me criar uma nova tabela calculada para que você possa entender facilmente o que está acontecendo.

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

Vou criar uma nova tabela. Em seguida, vou escrever sobre TODAS as datas do ano civil. Em seguida, escreverei Max Year e usarei CALCULATE sobre o MAX do Dates Calendar Year Number. E agora você pode ver que para cada linha, estamos repetindo o mesmo valor.

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

Como esses números não são estritamente menores que eles mesmos, estamos obtendo um espaço em branco. Mas quando usamos igual a (=), estamos dizendo que todos os valores menores que 2011 recebem um sete.

Além disso, mesmo se você estiver usando uma referência de medida como algo como Max Year, esse código não funcionará.

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

Se eu clicar em confirmar, você pode ver que ainda não recebemos nada. Isso ocorre porque, quando escrevemos Max Year, estamos simplesmente escrevendo CALCULATE MAX Dates Calendar Year Number.

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

Uma referência de medida sempre tem um CALCULATE fora dela. Assim, esta medida está iniciando uma transição de contexto que converte a linha atualmente iterada em um contexto de filtro.

Mas se você está vinculado e precisa usar uma referência de medida, o que você pode fazer é armazenar essa medida em uma variável. E como você deve saber, as variáveis ​​são constantes e não podem criar uma transição de contexto. Portanto, ele não pode converter o contexto de linha em um contexto de filtro.

Portanto, esta é uma demonstração rápida de como um contexto de linha e um contexto de filtro estão interagindo entre si em um código DAX.

Agora vamos ao DAX Studio para entender o que está acontecendo nos bastidores.

Usando o DAX Studio para entender o contexto de linha e o contexto de filtro

Vamos para Ferramentas Externas e iniciar o DAX Studio. Precisamos nos conectar ao arquivo do LuckyTemplates com a ajuda do Query Plan e do Server Timings .

Então, vou criar uma medida de consulta. Vou escrever DEFINE MEASURE na tabela Dates, Dates Running Total. E então, vou usar o código original que tínhamos.

Como devemos retornar uma tabela, podemos escrever EVALUATE. Finalmente, vamos criar a tabela usando SUMMARIZECOLUMNS. Então, vamos escrever Datas Número do ano civil e a coluna virtual, que será o Total em execução. E então, posso escrever algo como DT como uma palavra-chave do DAX Studio.

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

Se eu executar este código, você pode ver que o código está completo e ainda obtemos o mesmo resultado que vimos dentro do LuckyTemplates.

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

Agora, vamos ao Plano de Consulta para entender o que está acontecendo nos bastidores. Vamos ver se a função MAX é realmente dependente do contexto da linha ou não. Vamos para o Plano de Consulta lógico porque o Plano de Consulta físico geralmente é mais complexo e é um pouco difícil de ler.

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

Você pode ver que o primeiro operador na primeira linha é GroupSemiJoin e que é usado pelo SUMMARIZECOLUMNS para criar uma junta interna entre duas colunas.

Então, para unir essas colunas, existe o Scan_Vertipaq , que é o mecanismo de armazenamento que temos dentro dos serviços de análise. Podemos ver que ele diz que precisamos de uma coluna, que é Dates Calendar Year Number. No LuckyTemplates, você pode ver que na matriz, temos esta coluna Número do ano civil, que funciona como acesso ao nosso relatório.

Em seguida, temos a função COUNTROWS em nossa medida como um operador de nível superior e, em seguida, COUNTROWS chama a função FILTER para o filtro. Há um Scan_Vertipaq novamente, que diz que RequiredCols é Dates Calendar Year Number.

As linhas 2 e 5 são iguais, mas a primeira Scan_Vertipaq está marcada com zero enquanto a segunda está com um. Isso significa que a coluna que estamos acessando, com a ajuda da função ALL, é extraída separadamente da coluna que temos dentro da função SUMMARIZECOLUMNS.

Então, há um operador LessThan . Na próxima linha, podemos ver que há uma comparação entre o contexto da linha e a função MAX .

Isso é seguido pelo Max_Vertipaq . Portanto, na verdade, estamos extraindo o valor máximo do mecanismo de armazenamento. À direita, você pode ver que diz DependOnCols Dates Calendar Year Number. Esta é a coisa mais importante que precisamos lembrar. Anteriormente, eu disse que não há dependência da função MAX no contexto da linha, e isso é o que realmente prova isso.

E então, aqui diz zero.

Onde encontramos zero?

No topo (a segunda linha), que está sendo extraída para SUMMARIZECOLUMNS. Isso significa que a função MAX não depende do contexto da linha, mas na verdade depende da coluna (Calendar Year Number) que temos dentro dessa tabela. Portanto, essa tabela está realmente criando o contexto do filtro.

Resumindo, a função MAX depende do contexto do filtro e não do contexto da linha.

Em seguida, você pode ver que para calcular o Max_Vertipaq, temos um Scan_Vertipaq , que diz que DependOnCols zero (0) Date Calendar Year Number. E então, existem várias outras colunas que requerem colunas.

Agora vamos ver a versão variável do código. Em vez de retornar LastVisibleYear, retornarei a versão COUNTROWS ou a variável Result, e você pode ver que ainda obtemos o mesmo resultado.

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

Se olharmos para o Plano de Consulta, você pode ver que é um pouco mais longo, mas é muito mais fácil de ler.

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

Por fim, aqui está a versão calculada do código também

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates

E é assim que seu plano de consulta lógica se parece.

Contexto de linha e contexto de filtro em um código DAX do LuckyTemplates


DAX LuckyTemplates: o que é contexto de linha
Introdução ao contexto de filtro no LuckyTemplates
O que é transição de contexto e por que isso é importante?

Conclusão

Neste tutorial, expliquei como uma determinada função pode interagir e não pode interagir com o contexto da linha. Também mostrei como o MAX, neste caso, foi avaliado no contexto do filtro e não no contexto da linha.

É importante sempre lembrar que o contexto do filtro filtra todo o modelo e o contexto da linha apenas itera a tabela fornecida e nunca filtra o modelo. O contexto do filtro não itera uma tabela.

Espero que você tenha achado este tutorial útil. Fique atento ao nosso código DAX Studio que lançaremos muito em breve. Iremos muito mais fundo em cenários semelhantes. Também ensinaremos como você pode otimizar seu código DAX.

Leave a Comment

Colunas calculadas no SharePoint | Uma visão geral

Colunas calculadas no SharePoint | Uma visão geral

Descubra a importância das colunas calculadas no SharePoint e como elas podem realizar cálculos automáticos e obtenção de dados em suas listas.

Atributos pré-atentivos: como isso pode afetar seu relatório

Atributos pré-atentivos: como isso pode afetar seu relatório

Descubra todos os atributos pré-atentivos e saiba como isso pode impactar significativamente seu relatório do LuckyTemplates

Calcular Dias de Estoque Zero – LuckyTemplates Inventory Management Insights

Calcular Dias de Estoque Zero – LuckyTemplates Inventory Management Insights

Aprenda a contar o número total de dias em que você não tinha estoque por meio dessa técnica eficaz de gerenciamento de inventário do LuckyTemplates.

Usando exibições de gerenciamento dinâmico (DMV) no DAX Studio

Usando exibições de gerenciamento dinâmico (DMV) no DAX Studio

Saiba mais sobre as exibições de gerenciamento dinâmico (DMV) no DAX Studio e como usá-las para carregar conjuntos de dados diretamente no LuckyTemplates.

Variáveis ​​e expressões dentro do editor do Power Query

Variáveis ​​e expressões dentro do editor do Power Query

Este tutorial irá discutir sobre Variáveis e Expressões dentro do Editor do Power Query, destacando a importância de variáveis M e sua sintaxe.

Como calcular a diferença em dias entre compras usando o DAX no LuckyTemplates

Como calcular a diferença em dias entre compras usando o DAX no LuckyTemplates

Aprenda a calcular a diferença em dias entre compras usando DAX no LuckyTemplates com este guia completo.

Calculando a média no LuckyTemplates: isolando os resultados do dia da semana ou do fim de semana usando o DAX

Calculando a média no LuckyTemplates: isolando os resultados do dia da semana ou do fim de semana usando o DAX

Calcular uma média no LuckyTemplates envolve técnicas DAX para obter dados precisos em relatórios de negócios.

O que é self em Python: exemplos do mundo real

O que é self em Python: exemplos do mundo real

O que é self em Python: exemplos do mundo real

Como salvar e carregar um arquivo RDS em R

Como salvar e carregar um arquivo RDS em R

Você aprenderá como salvar e carregar objetos de um arquivo .rds no R. Este blog também abordará como importar objetos do R para o LuckyTemplates.

Primeiros N dias úteis revisitados - uma solução de linguagem de codificação DAX

Primeiros N dias úteis revisitados - uma solução de linguagem de codificação DAX

Neste tutorial de linguagem de codificação DAX, aprenda como usar a função GENERATE e como alterar um título de medida dinamicamente.