Rolling 12 Months Average em DAXputing a média de 12 meses em DAX parece uma tarefa simples, mas esconde alguma complexidade Este artigo explica como escrever a melhor fórmula evitando armadilhas comuns usando funções de inteligência de tempo. Começamos com o usual modelo de dados AdventureWorks , Com a tabela de produtos, vendas e calendário O calendário foi marcado como uma tabela de calendário é necessário trabalhar com qualquer função de inteligência de tempo e nós construímos uma hierarquia simples ano-mês-data Com este conjunto, é muito fácil criar um Primeira tabela dinâmica mostrando as vendas ao longo do tempo. Ao fazer análise de tendência, se as vendas estão sujeitas à sazonalidade ou, de forma mais geral, se você deseja remover o efeito de picos e quedas nas vendas, uma técnica comum é a de calcular o valor durante um determinado período , Geralmente 12 meses, e média ele A média de rolamento sobre 12 meses fornece um indicador liso da tendência e é muito útil em charts. Given uma data, nós podemos computar a média de rolamento de 12 meses com thi Que ainda tem alguns problemas que vamos resolver mais tarde. O comportamento da fórmula é simples que calcula o valor de Vendas após a criação de um filtro no calendário que mostra exatamente um ano completo de dados O núcleo da fórmula é o DATESBETWEEN , Que retorna um conjunto inclusivo de datas entre os dois limites. O mais baixo é. Lendo-o do mais íntimo se estamos mostrando dados para um mês, digamos em julho de 2007, tomamos a última data visível usando LASTDATE, que retorna o último dia em Julho de 2007 Em seguida, usamos NEXTDAY para tomar 01 de agosto de 2007 e nós finalmente usar SAMEPERIODLASTYEAR para deslocá-lo de volta um ano, rendendo 01 de agosto de 2006 O limite superior é simplesmente LASTDATE, ou seja, final de julho de 2007.Se usamos esta fórmula em um PivotTable, o resultado parece bom, mas temos um problema para a última data. Na verdade, como você pode ver na figura, o valor é corretamente calculado até 2008 Então, não há valor em 2009 que está correto, nós don t Têm vendas em 2009, mas há um surpri Em dezembro de 2010, onde nossa fórmula mostra o total geral em vez de um valor em branco, como seria de esperar. De fato, em dezembro, LASTDATE retorna o último dia do ano e NEXTDAY deve retornar a 1 de janeiro de 2011 Mas NEXTDAY é Uma função de inteligência de tempo e é esperado para retornar conjuntos de datas existentes Este fato não é muito evidente e vale a pena algumas palavras more. Time funções de inteligência não executar matemática em datas Se você quiser ter o dia após uma determinada data, Você pode simplesmente adicionar 1 a qualquer coluna de data eo resultado será o dia seguinte Em vez disso, as funções de inteligência de tempo deslocam conjuntos de data de ida e volta ao longo do tempo Assim, NEXTDAY leva a sua entrada no nosso caso uma tabela de uma linha com os 31 de Dezembro 2010 e muda um dia mais tarde O problema é que o resultado deve ser 1 de janeiro de 2011, mas, como a tabela do calendário não contém essa data, o resultado é BLANK. Thus, nossa expressão calcula vendas com um limite inferior em branco, que Significa o início De tempo, resultando como resultado o total de vendas Para corrigir a fórmula é suficiente para alterar a ordem de avaliação do limite inferior. Como você pode ver, agora NEXTDAY é chamado após a mudança de um ano de volta Desta forma, Tomamos 31 de dezembro de 2010, movê-lo para 31 de dezembro de 2009 e tomar o dia seguinte, que é 01 de janeiro de 2010 uma data existente na tabela de calendário. O resultado é agora o esperado one. At neste ponto, só precisamos dividir Esse número por 12 para obter a média móvel Mas, como você pode facilmente imaginar, nem sempre podemos dividi-lo por 12 Na verdade, no início do período não há 12 meses para agregar, mas um número menor Nós precisamos calcular a Número de meses para os quais há vendas Isso pode ser realizado usando a filtragem cruzada da tabela de calendário com a tabela de vendas depois de aplicar o novo contexto de 12 meses Definimos uma nova medida que calcula o número de meses existentes no período de 12 meses. Pode ver na próxima figura que o Months12 M calcula um valor correto. Vale ressaltar que a fórmula não funciona se você escolher um período maior que 12 meses, porque o Calendário MonthName tem apenas 12 valores Se você precisar de períodos mais longos, você precisará usar uma coluna AAAAMM Para ser capaz de contar mais do que 12. A parte interessante desta fórmula que usa filtragem cruzada é o fato de que ele calcula o número de meses disponíveis, mesmo quando você filtra usando outros atributos Se, por exemplo, você selecionar a cor azul usando um slicer , Então as vendas começam em julho de 2007 não em 2005, como acontece para muitas outras cores. Usando o filtro cruzado em vendas, a fórmula calcula corretamente que em julho de 2007 há um único mês de vendas disponíveis para Blue. At este ponto, A média é apenas um afastamento DIVIDE away. When usá-lo em uma tabela dinâmica, ainda temos uma pequena questão de fato, o valor é calculado também para os meses para os quais não há vendas ou seja, meses futuros. Isso pode ser resolvido usando uma instrução IF Para evitar que a fórmula Mostrando valores quando não há vendas Eu não tenho nada contra IF, mas, para o desempenho viciado entre vocês, é sempre vale a pena lembrar que IF pode ser um assassino desempenho, porque poderia forçar motor fórmula DAX para chutar n Neste caso específico, A diferença é desprezível, mas, como regra geral, a melhor maneira de remover o valor quando não há vendas é confiar em fórmulas de mecanismo de armazenamento puro como este oneparing um gráfico usando o Avg12M com outro que mostra Vendas você pode facilmente apreciar Como a média móvel esboça as tendências de uma forma muito mais limpa. Mantenha-me informado sobre os próximos artigos da newsletter Desmarque para baixar livremente o arquivo. Eu estou trabalhando com o SQL Server 2008 R2, tentando calcular uma média móvel Para cada registro na minha opinião, Gostaria de coletar os valores dos 250 registros anteriores e, em seguida, calcular a média para esta seleção. Minhas colunas de exibição são as follows. TransactionID é exclusivo para cada TransactionID eu gostaria de calcular a média f Ou valor da coluna, acima de 250 registros anteriores Assim para TransactionID 300, coletar todos os valores de 250 linhas anteriores exibição é ordenada decrescente por TransactionID e, em seguida, na coluna MovAvg escrever o resultado da média desses valores Estou olhando para coletar dados dentro de um intervalo de Records. asked Oct 28 14 at 20 58.Tempo exponencial média em T-SQL. Médias móveis exponenciais são semelhantes às médias móveis ponderadas em que eles atribuem menos peso às mudanças há muito tempo, e mais peso para as mudanças recentes médias ponderadas são lineares, Mas as médias móveis exponenciais são exponenciais. Ou seja, o peso pode ser expresso como uma curva. Existe uma ótima maneira de calcular médias exponenciais em T-SQL usando um recurso não documentado sobre variáveis e totais em execução no SQL Server. Mostrar como usar esse método para calcular a média móvel exponencial em T-SQL, mas também apresentarei um método que está usando recursos padrão no SQL Server Infelizmente, isso significa usar um lo Op. Nos exemplos vou calcular uma média móvel exponencial de 9 dias Os exemplos usam o banco de dados TAdb Um script para criar TAdb pode ser encontrado aqui. Motiva exponencial EMA executando totais Método. A teoria por trás do total de recursos correntes em atualizações é descrito em Detalhe por Jeff Moden em seu artigo que resolve os problemas correntes do Rank total e ordinal. Other os recursos que descrevem usar este método para calcular EMA são o borne do blog que calcula médias moventes com T-SQL por Gabriel Priester e o desafio exponencial da movimentação do borne do forum ambos sobre SQL Server Central. Basicamente, em T-SQL você pode atualizar variáveis, bem como colunas em uma instrução de atualização As atualizações são feitas linha a linha internamente pelo SQL Server Este comportamento row by row é o que torna o cálculo de um total running. This exemplo mostra Como funciona. Note que ColumnRunningTotal é um total de ColumnToSum. Using este método podemos calcular EMA9 com este T-SQL. O cálculo da EMA é bastante simples Nós Use a linha atual eo anterior, mas com mais peso para a linha atual O peso é calculado pela fórmula 2 1 9, onde 9 é o parâmetro para o comprimento da EMA Para calcular EMA9 para a linha 10 acima, o cálculo é. Neste caso, a linha atual obtém 20 do peso 2 1 9 0 2 ea linha anterior recebe 80 do peso 1-2 1 9 0 8.Você encontra esse cálculo na declaração acima na instrução CASE. Média móvel exponencial EMA Looping Method. As que eu saiba, exceto para o método de totais de corrida descrito acima, não há maneira de calcular EMA usando um conjunto baseado SQL instrução Portanto, o T-SQL abaixo está usando um loop while para calcular EMA9.Os resultados são O mesmo que no exemplo de totais em execução acima. Como esperado, o conjunto baseado execução totais versão é maneira mais rápida do que a versão de loop Em minha máquina a solução baseada em conjunto foi de cerca de 300 ms, em comparação com cerca de 1200 com a versão loop A versão loop é Conformidade com os padrões SQL. No entanto, a escolha entre A média móvel exponencial pode ser usada na análise de tendência, como acontece com os outros tipos de médias móveis, média móvel simples SMA e média móvel ponderada WMA. Há também outros Cálculos em análise técnica que usa o EMA, MACD, por exemplo. Esta postagem do blog é parte de uma série sobre análise técnica, TA, no SQL Server Veja os outros posts aqui. Posted por Tomas Lind. Tomas Lind - Serviços de consultoria como SQL Server DBA E desenvolvedor de banco de dados na High Coast Database Solutions AB.
No comments:
Post a Comment