Wednesday 6 September 2017

Moving Average Dax


Eu estou tentando criar uma média móvel de 12 meses para os dados da conta pessoal usando o seguinte DAX (seguindo uma postagem no blog por Javier). O problema é que a medida do tempo de conclusão é uma medida calculada e não um valor de coluna. Portanto, eu continuo recebendo a seguinte mensagem de erro 1 quotMeasure Monthly Headcount12 Month AVG Headcount. A função MÉDIA apenas aceita uma referência de coluna como o número de argumento 1quot. Eu realmente não quero colocar a lógica para Enting Headcount na consulta acima. Existe alguma maneira de contornar isso. Eu tentei fazer um SUM (Enting Headcount) CountRows (.) E SUM só aceita uma referência de coluna também. Obrigado pela ajuda. Frank Changed type Ed Price - MSFT Empregado Microsoft, Owner Terça-feira, 10 de dezembro de 2013 6:58 AM Sem resposta Segunda-feira, 04 de março de 2013 4:47 PM Todas as respostas É ainda um problema Responda uma pergunta interessante Crie um artigo do wiki sobre isso Domingo, 24 de novembro de 2013 2:22 AM A Microsoft está realizando uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você deixar o site Msdn. Gostaria de participar 2017 da Microsoft. Todos os direitos reservados. Servidor SQL Denali PowerPivot Alberto Ferrari já escreveu sobre o cálculo de médias móveis em DAX usando uma coluna calculada. Eu gostaria de apresentar uma abordagem diferente aqui usando uma medida calculada. Para a média móvel I8217m calculando uma média móvel diária (nos últimos 30 dias) aqui. Para o meu exemplo, I8217m usando o livro PowerPivot que pode ser baixado como parte dos Projetos de Modelos Tabulares SSAS das amostras Denali CTP 3. Nesta publicação, I8217m desenvolvendo a fórmula passo a passo. No entanto, se você estiver com pressa, você pode querer diretamente para os resultados finais abaixo. Com o ano de calendário de 2003 no filtro, a data em colunas e o valor das vendas (da tabela de Vendas na Internet) nos detalhes, os dados da amostra se parecem com isto: Em cada contexto da linha8217s, a expressão DateDate fornece o contexto atual, ou seja, a data dessa linha . Mas, a partir de uma medida calculada, não podemos referir esta expressão (como não existe uma linha atual para a tabela Data), em vez disso, devemos usar uma expressão como LastDate (DateDate). Então, para obter os últimos trinta dias, podemos usar essa expressão. Agora, podemos resumir nossas vendas na internet para cada um desses dias usando a função de resumo: Resumir (160 DatasInPeriod (DateDate, LastDate (DateDate), - 30, DIA) 160, DateDate 160. quotSalesAmountSumquot 160. Sum (Internet SalesSales Amount)) E, finalmente, usamos a função DAX AverageX para calcular a média desses 30 valores: Quantidade de Vendas (30d avg): AverageX (160 Summarize (160160160 DatesInPeriod (DateDate, LastDate (DateDate), - 30, DIA) 160160160, DateDate 160160160. quotSalesAmountSumquot 160160160. Soma (Internet SalesSales Amount) 160) 160, SalesAmountSum) Este é o cálculo que estamos usando na nossa tabela de vendas na Internet, conforme mostrado na imagem abaixo: Ao adicionar este cálculo à tabela dinâmica a partir de cima, o resultado parece assim: Olhando para o resultado, parece que não temos dados antes de 1º de janeiro de 2003: o primeiro valor para a média móvel é idêntico ao valor do dia ( Lá estão E nenhuma linha antes dessa data). O segundo valor para a média móvel é na verdade a média dos dois primeiros dias e assim por diante. Isso não é bastante correto, mas I8217m voltando a esse problema em um segundo. A captura de tela mostra a computação para a média móvel de 31 de janeiro como a média dos valores diários de 2 a 31 de janeiro. Nossa medida calculada também funciona bem quando os filtros são aplicados. Na captura de tela a seguir, usei duas categorias de produtos para a série de dados: como nossa medida calculada funciona em níveis de agregação maiores Para descobrir, I8217m usando a hierarquia do Calendário nas linhas (em vez da data). Por simplicidade, removi os níveis de semestre e trimestre usando as opções da tabela dinâmica do Excel8217s (opção de campos de exibição). Como você pode ver, o cálculo ainda funciona bem. Aqui, o agregado mensal é a média móvel para o último dia do mês específico. Você pode ver isso claramente em janeiro (valor de 14,215.01 também aparece na captura de tela acima como valor para 31 de janeiro). Se este fosse o requisito de negócios (o que parece razoável para uma média diária), a agregação funciona bem em um nível mensal (caso contrário, teremos que ajustar nosso cálculo e este será um tópico da próxima publicação). Mas, embora a agregação faça sentido em um nível mensal, se expandimos essa visão para o nível do dia, você observa que nossa medida calculada simplesmente retorna o valor das vendas para esse dia, e não a média dos últimos 30 dias. Como isso pode ser. O problema resulta do contexto em que calculamos a nossa soma, como destacado no seguinte código: Valor de Vendas (30d avg): AverageX (160 Resumir (160160160 datasinperiod (DateDate, LastDate (DataDate), - 30, DIA) 160160160, DateDate 160160160. quotSalesAmountSumquot 160160160. Soma (Internet SalesSales Amount) 160) 160, SalesAmountSum) Uma vez que avaliamos essa expressão ao longo do período de datas, o único contexto que é substituído aqui é DateDate. Em nossa hierarquia, utilizamos diferentes atributos de nossa dimensão (Ano Calendário, Mês e Dia do Mês). Como esse contexto ainda está presente, o cálculo também é filtrado por esses atributos. E isso explica por que o contexto atual do dia8217s ainda está presente para cada linha. Para deixar as coisas claras, desde que avaliemos esta expressão fora do contexto de uma data, tudo está bem à medida que a seguinte consulta DAX é executada pelo Management Studio na perspectiva de vendas da Internet do nosso modelo (usando o banco de dados tabular com os mesmos dados ): Avaliar (160160160 Resumir (160160160160160160160 datasinperiod (DateDate, date (2003,1,1), - 5, DIA) 160160160160160160160, DateDate 160160160160160160160. quotSalesAmountSumquot 160160160160160160160. Sum (Internet SalesSales Amount) 160160160)) Aqui, reduzi o período de tempo Para 5 dias e também definir uma data fixa, pois LastDate (8230) resultaria na última data da minha tabela de dimensão da data para a qual nenhum dado está presente nos dados da amostra. Aqui está o resultado da consulta: No entanto, depois de configurar um filtro para 2003, nenhuma linha de dados fora de 2003 será incluída na soma. Isso explica a observação acima: parecia que só temos dados a partir de 1º de janeiro de 2003. E agora, sabemos o porquê: o ano de 2003 estava no filtro (como você pode ver na primeira captura de tela desta postagem) e Portanto, estava presente no cálculo da soma. Agora, tudo o que temos a fazer é se livrar desses filtros adicionais, porque nós já filtramos nossos resultados por Data. A maneira mais fácil de fazer isso é usar a função Calcular e aplicar ALL (8230) para todos os atributos para os quais queremos remover o filtro. Como temos alguns desses atributos (Ano, Mês, Dia, Dia da Semana, 8230) e queremos remover o filtro de todos eles, mas o atributo de data, a função de atalho ALLEXCEPT é muito útil aqui. Se você tiver um fundo MDX, você se perguntará por que nós não precisamos ter um problema semelhante ao usar o SSAS no modo OLAP (BISM Multidimensional). A razão é que o nosso banco de dados OLAP tem relações de atributos, então, depois de definir o atributo data (chave), os outros atributos também são alterados automaticamente e nós não precisamos cuidar disso (veja minha postagem aqui). Mas, no modelo tabular, não temos relacionamentos de atributos (nem mesmo um verdadeiro atributo de chave) e, portanto, precisamos eliminar filtros indesejados de nossos cálculos. Então, aqui estamos com o valor das vendas 8230 (30d avg): AverageX (160 Resumir (160160160 datesinperiod (DateDate, LastDate (DataDate), - 30, DIA) 160160160, DateDate 160160160. quotSalesAmountSumquot 160160160. calcular (Sum (Internet SalesSales Amount) , ALLEXCEPT (Date, DateDate)) 160), SalesAmountSum) E esta é a nossa tabela dinâmica final no Excel: para ilustrar a média móvel, aqui é o mesmo extrato de dados em uma vista de gráfico (Excel): embora filtrássemos nossos dados em 2003, a média móvel para os primeiros 29 dias de 2003 corretamente leva em conta os dias correspondentes de 2002. Você reconhecerá os valores dos 30 e 31 de janeiro da nossa primeira abordagem, pois foram os primeiros dias para os quais o nosso primeiro cálculo teve uma quantidade suficiente de dados (30 dias completos). Servidor SQL Denali PowerPivot Alberto Ferrari já escreveu sobre o cálculo de médias móveis em DAX usando uma coluna calculada. Gostaria de apresentar uma abordagem diferente aqui usando uma medida calculada. Para a média móvel, calculo uma média móvel diária (nos últimos 30 dias) aqui. Para o meu exemplo, estou usando a pasta de trabalho do PowerPivot, que pode ser baixada como parte dos Projetos do Modelo Tabular SSAS das amostras do Denali CTP 3. Nesta publicação, estou desenvolvendo a fórmula passo a passo. No entanto, se você estiver com pressa, você pode querer diretamente para os resultados finais abaixo. Com o ano de calendário de 2003 no filtro, a data em colunas e o valor das vendas (da tabela de Vendas na Internet) nos detalhes, os dados da amostra se parecem com isto: em cada contexto de linhas, a expressão 8216DateDate fornece o contexto atual, ou seja, a data dessa linha . Mas, a partir de uma medida calculada, não podemos referir esta expressão (como não existe uma linha atual para a tabela Data), em vez disso, devemos usar uma expressão como LastDate (8216DateDate). Então, para obter os últimos trinta dias, podemos usar essa expressão. Agora podemos resumir nossas vendas na internet para cada um desses dias usando a função de resumo: Resumir (DatasInPeriod (8216DateDate, LastDate (8216DateDate), - 30, DIA), 8217DateDate 8220SalesAmountSum8221. Soma (8216Internet SalesSales Amount)) E, finalmente, estavam usando a função DAX AverageX para calcular a média desses 30 valores: Quantidade de vendas (30d avg): AverageX (Resumir (DatasInPeriod (8216DateDate, LastDate (8216DateDate), - 30, DIA), 8217DateDate. 8220SalesAmountSum8221. Soma (8216Internet SalesSales Amount)), SalesAmountSum) Este é o cálculo que estamos usando na nossa tabela de vendas na Internet, conforme mostrado na captura de tela abaixo: Ao adicionar este cálculo à tabela dinâmica a partir do acima, O resultado é assim: olhando o resultado, parece que não temos dados antes de 1º de janeiro de 2003: o primeiro valor para a média móvel é idêntico ao valor do dia (não há linhas antes dessa data). O segundo valor para a média móvel é na verdade a média dos dois primeiros dias e assim por diante. Isso não é bastante correto, mas estou voltando a esse problema em um segundo. A captura de tela mostra a computação para a média móvel de 31 de janeiro como a média dos valores diários de 2 a 31 de janeiro. Nossa medida calculada também funciona bem quando os filtros são aplicados. Na captura de tela a seguir, usei duas categorias de produtos para a série de dados: como nossa medida calculada funciona em níveis de agregação maiores. Para descobrir, estou usando a hierarquia do Calendário nas linhas (em vez da data). Por simplicidade, removi o semestre e o quarto dos níveis usando as opções da tabela dinâmica Excels (opção ShowHide fields). Como você pode ver, o cálculo ainda funciona bem. Aqui, o agregado mensal é a média móvel para o último dia do mês específico. Você pode ver isso claramente em janeiro (valor de 14,215.01 também aparece na captura de tela acima como valor para 31 de janeiro). Se este fosse o requisito de negócios (o que parece razoável para uma média diária), a agregação funciona bem em um nível mensal (caso contrário, teremos que ajustar nosso cálculo e este será um tópico da próxima publicação). Mas, embora a agregação faça sentido em um nível mensal, se expandimos essa visão para o nível do dia, você verá que nossa medida calculada simplesmente retorna o valor das vendas para esse dia, e não a média dos últimos 30 dias. Como isso pode ser. O problema resulta do contexto em que calculamos a nossa soma, como destacado no seguinte código: Valor de Vendas (30d avg): AverageX (Resumir (datasinperiod (8216DateDate, LastDate (8216DateDate), - 30, DIA), 8217DateDate. 8220SalesAmountSum8221. Soma (valor de vendas 8216Internet Sales)), SalesAmountSum) Uma vez que avaliamos essa expressão no período de datas determinado, o único contexto que é substituído aqui é 8216DateDate. Em nossa hierarquia, utilizamos atributos diferentes de nossa dimensão (Ano, Mês e Dia do mês). Como esse contexto ainda está presente, o cálculo também é filtrado por esses atributos. E isso explica por que o contexto dos dias atuais ainda está presente para cada linha. Para deixar as coisas claras, desde que avaliemos esta expressão fora do contexto de uma data, tudo está bem à medida que a seguinte consulta DAX é executada pelo Management Studio na perspectiva de vendas da Internet do nosso modelo (usando o banco de dados tabular com os mesmos dados ): Avaliar (resumir (datasinperíodo (8216DateDate, data (2003,1,1), - 5, DIA), 8217DateDate. 8220SalesAmountSum8221. Soma (8216Internet SalesSales Amount))) Aqui, reduzi o período de tempo para 5 dias e também Uma data fixa como LastDate () resultaria na última data da tabela de dimensão da minha data para a qual nenhum dado está presente nos dados da amostra. Aqui está o resultado da consulta: No entanto, depois de configurar um filtro para 2003, nenhuma linha de dados fora de 2003 será incluída na soma. Isso explica a observação acima: parecia que só temos dados a partir de 1º de janeiro de 2003. E agora, sabemos o porquê: o ano de 2003 estava no filtro (como você pode ver na primeira captura de tela desta postagem) e Portanto, estava presente no cálculo da soma. Agora, tudo o que temos a fazer é eliminar esses filtros adicionais porque já estavam filtrando nossos resultados por Data. A maneira mais fácil de fazer isso é usar a função Calcular e aplicar ALL () para todos os atributos para os quais queremos remover o filtro. Como temos alguns desses atributos (Ano, Mês, Dia, Dia da semana), e queremos remover o filtro de todos eles, mas o atributo de data, a função de atalho ALLEXCEPT é muito útil aqui. Se você tiver um fundo MDX, você vai se perguntar por que não temos um problema semelhante ao usar SSAS no modo OLAP (BISM Multidimensional). O motivo é que o nosso banco de dados OLAP tem relações de atributos, então, depois de definir o atributo data (chave), os outros atributos também são alterados automaticamente e não precisamos cuidar disso (veja a minha postagem aqui). Mas no modelo tabular não temos relações de atributos (nem mesmo um verdadeiro atributo de chave) e, portanto, precisamos eliminar filtros indesejados de nossos cálculos. Então, aqui estamos com o Valor de Vendas (30d avg): AverageX (Summarize (datasinperiod (8216DateDate, LastDate (8216DateDate), - 30, DAY), 8217DateDate. 8220SalesAmountSum8221. Calcule (Sum (8216Internet SalesSales Amount), ALLEXCEPT (8216Date8217,8217DateDate ))), SalesAmountSum) E esta é a nossa tabela dinâmica final no Excel: para ilustrar a média móvel, aqui está o mesmo extrato de dados em uma vista de gráfico (Excel): embora filtrássemos nossos dados em 2003, a média móvel para o primeiro 29 dias de 2003 corretamente leva em conta os dias correspondentes de 2002. Você reconhecerá os valores dos 30 e 31 de janeiro da nossa primeira abordagem, pois foram os primeiros dias para os quais nosso primeiro cálculo teve uma quantidade suficiente de dados (30 dias completos).

No comments:

Post a Comment