Média rolante com funções analíticas Oracle Este pequeno exemplo irá demonstrar como usar as funções analíticas Oracles para obter a média móvel. Primeiro, você precisa criar e carregar uma tabela que contenha uma média média de cada mês em Edimburgo nos anos 1764-1820. O script para fazer isso pode ser encontrado aqui. Depois de preencher esta tabela, use esta declaração para encontrar a temperatura média nos últimos 12 meses para cada mês no conjunto de resultados: O resultado (encurtado) é: A segunda e a terceira colunas são o mês e o ano. A primeira coluna é a temperatura média para este mês, a última coluna é a média das temperaturas médias atuais e dos últimos 11 meses. A média móvel expressiva em T-SQL As médias móveis exponentes são semelhantes às médias móveis ponderadas na medida em que atribuem menos peso às mudanças Há muito tempo, e mais peso para as mudanças recentes. As médias móveis 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 as médias móveis exponenciais no T-SQL usando um recurso indocumentado sobre variáveis e totais em execução no SQL Server. Nesta publicação no blog, vou 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 esteja usando recursos padrão no SQL Server. Infelizmente, isso significa usar um loop. Nos exemplos, calculo uma média móvel exponencial de 9 dias. Os exemplos utilizam o banco de dados TAdb. Um script para criar o TAdb pode ser encontrado aqui. Média móvel exponencial (EMA): Método de execução de totais A teoria por trás das funcionalidades totais em execução em atualizações é descrita em detalhes por Jeff Moden em seu artigo, Resolvendo os Problemas de Ordem Total e Ordinal. Outros recursos que descrevem o uso desse método para calcular EMA são as postagens do blog Calculando as médias móveis com o T-SQL por Gabriel Priester e o fórum Exponential Moving Average Challenge. Ambos no SQL Server Central. Basicamente, no T-SQL você pode atualizar variáveis, bem como colunas em uma declaração de atualização. As atualizações são feitas linha a linha internamente pelo SQL Server. Esse comportamento de linha a linha é o que torna o cálculo de um total executável possível. Este exemplo mostra como funciona: Observe que 8220ColumnRunningTotal8221 é um total executado de 8220ColumnToSum8221. Usando este método, podemos calcular EMA9 com este T-SQL: o cálculo de EMA é bastante simples. Usamos a linha atual e a anterior, mas com mais peso para a linha atual. O peso é calculado pela fórmula 2 (19), onde 822098221 é 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 (19) 0,2) e a linha anterior recebe 80 do peso (1-2 (19) 0,8). Você encontra este cálculo na declaração acima na instrução CASE: Média de Movimento Exponencial (EMA): Método de Looping Tanto quanto eu sei, exceto o método de execução de totais descrito acima, não há como calcular EMA usando uma instrução SQL baseada em conjunto . Portanto, o T-SQL abaixo está usando um loop while para calcular EMA9: os resultados são os mesmos que no exemplo de totais em execução acima. Desempenho Como esperado, a versão de totais em execução baseada em conjunto é muito mais rápida do que a versão do loop. Na minha máquina, a solução baseada em conjunto era de cerca de 300 ms, em comparação com cerca de 1200 com a versão do loop. A versão de loop está mais em conformidade com os padrões SQL, no entanto. Portanto, a escolha entre os métodos depende do que seja o mais importante para você, desempenho ou padrões. A média móvel exponencial pode ser usada na análise de tendências, como ocorre com os outros tipos de médias móveis, média movente simples (SMA) e média móvel ponderada (WMA). Existem também outros cálculos em análises técnicas que utilizam o EMA, MACD, por exemplo. Esta publicação no blog faz parte de uma série sobre análise técnica, TA, no SQL Server. Veja as outras publicações aqui. Postado por Tomas Lind Tomas Lind - Serviços de consultoria como SQL Server DBA e Desenvolvedor de banco de dados em High Coast Database Solutions AB. Esta é uma pergunta Evergreen Joe Celko. Ignoro qual plataforma DBMS é usada. Mas, em qualquer caso, Joe conseguiu responder há mais de 10 anos com o SQL padrão. Joe Celko SQL Puzzles and Answers citação: Essa última tentativa de atualização sugere que poderíamos usar o predicado para construir uma consulta que nos daria uma média móvel: a coluna extra ou a abordagem de consulta melhor. A consulta é tecnicamente melhor porque a abordagem UPDATE Desmoralize o banco de dados. No entanto, se os dados históricos que estão sendo registrados não mudem e o cálculo da média móvel é caro, você pode considerar usar a abordagem da coluna. Consulta SQL Puzzle: por todos os meios uniforme. Você simplesmente joga no balde de peso apropriado dependendo da distância do ponto de tempo atual. Por exemplo, quottake weight1 para datapoints dentro de 24 horas a partir do ponto de dados atual0.5 para pontos de dados dentro de 48hrsquot. Esse caso é importante quantos pontos de dados consecutivos (como 6:12 am e 11:48 pm) estão distantes um do outro Um caso de uso que eu posso pensar seria uma tentativa de alisar o histograma sempre que os pontos de dados não são suficientemente densos. 22:22 Não tenho certeza se o resultado esperado (saída) mostra uma média simples de movimentação simples (rolando) durante 3 dias. Como, por exemplo, o primeiro triplo dos números, por definição, dá: mas você espera 4.360 e é confuso. No entanto, sugiro a seguinte solução, que usa AVG de função de janela. Essa abordagem é muito mais eficiente (clara e menos intensiva em recursos) do que a SELF-JOIN introduzida em outras respostas (e estou surpreso que ninguém tenha dado uma solução melhor). Você vê que o AVG está envolvido com o caso quando rownum gt p. days, em seguida, para forçar NULL s nas primeiras linhas, onde 3 Day Moving Average não tem sentido. Respondeu 23 de fevereiro às 13:12. Podemos aplicar o método de junção externa suja esquerda de Joe Celkos (como citado acima por Diego Scaravaggi) para responder a pergunta conforme foi solicitado. Gera a saída solicitada: respondeu Jan 9 16 às 0:33 Sua resposta 2017 Stack Exchange, Inc
Комментариев нет:
Отправить комментарий