Friday 18 August 2017

Moving Average Function In Sql


Média móvel em T-SQL Um cálculo comum na análise de tendências é a média móvel (ou rolando). Uma média móvel é a média das, por exemplo, as últimas 10 linhas. A média móvel mostra uma curva mais suave do que os valores reais, mais ainda com um período mais longo para a média móvel, tornando-se uma boa ferramenta para análise de tendências. Esta publicação do blog mostrará como calcular a média móvel em T-SQL. Métodos diferentes serão usados ​​dependendo da versão do SQL Server. O gráfico abaixo demonstra o efeito de suavização (linha vermelha) com uma média móvel de 200 dias. As citações de ações são a linha azul. A tendência a longo prazo é claramente visível. T-SQL Moving Avergage 200 dias A demonstração abaixo requer o banco de dados TAdb que pode ser criado com o script localizado aqui. No próximo exemplo, calcularemos uma média móvel nos últimos 20 dias. Dependendo da versão do SQL Server, haverá um método diferente para fazer o cálculo. E, como veremos mais adiante, as versões mais recentes do SQL Server têm funções que permitem um cálculo muito mais efetivo. SQL Server 2012 e posterior Média móvel Esta versão faz uso de uma função de janela agregada. O que é novo no SQL 2012 é a possibilidade de restringir o tamanho da janela, especificando quantas linhas que precedem a janela devem conter: as linhas anteriores são 19, pois incluiremos a linha atual também no cálculo. Como você pode ver, o cálculo da média móvel no SQL Server 2012 é bastante simples. A figura abaixo demonstra o princípio de janelas. A linha atual é marcada com amarelo. A janela é marcada com um fundo azul. A média móvel é simplesmente a média de QuoteClose nas linhas azuis: janela média T-SQL. Os resultados dos cálculos em versões antigas do SQL Server são os mesmos, então eles não serão exibidos novamente. SQL Server 2005 8211 2008R2 Média móvel Esta versão faz uso de uma expressão de tabela comum. O CTE é auto-referenciado para obter as últimas 20 linhas para cada linha: Média em Movimento antes do SQL Server 2005 A versão pré 2005 usará uma junção externa esquerda para a mesma tabela para obter as últimas 20 linhas. A tabela externa pode ser dita para conter a janela em que queremos calcular uma média: Comparação de desempenho Se executamos os três métodos diferentes simultaneamente e verifique o plano de execução resultante, há uma diferença dramática no desempenho entre os métodos: Comparação de três Métodos diferentes para calcular a média móvel Como você pode ver, as melhorias na função de janelas no SQL 2012 fazem uma grande diferença no desempenho. Conforme mencionado no início desta publicação, as médias móveis são usadas como uma ferramenta para ilustrar as tendências. Uma abordagem comum é combinar médias móveis de diferentes comprimentos, a fim de detectar mudanças nas tendências de curto, médio e longo prazo, respectivamente. De particular interesse são o cruzamento de linhas de tendência. Por exemplo, quando a tendência curta se move sobre a tendência longa ou média, isso pode ser interpretado como um sinal de compra na análise técnica. E quando a tendência curta se move sob uma linha de tendência mais longa, isso pode ser interpretado como um sinal de venda. O gráfico abaixo mostra Quotes, Ma20, Ma50 e Ma200. T-SQL Ma20, Ma50, Ma200 vendem e vendem sinais. 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. Anteriormente, discutimos como escrever médias móveis em Postgres. Pela demanda popular, mostrava-se como fazer o mesmo no MySQL e no SQL Server. Bem, cubra como anotar gráficos ruidosos como este: Com uma linha média anterior de 7 dias como esta: A grande ideia Nosso primeiro gráfico acima é bastante ruidoso e difícil de obter informações úteis. Podemos suavizá-lo, traçando uma média de 7 dias em cima dos dados subjacentes. Isso pode ser feito com funções de janela, auto-junções ou subconsultas correlatas - bem, cubra os dois primeiros. Bem, comece com uma média anterior, o que significa que o ponto médio no dia 7 do mês é a média dos primeiros sete dias. Visualmente, isso muda os picos no gráfico à direita, como uma grande espiga é calculada a média nos sete dias seguintes. Primeiro, crie uma tabela de contagem intermediária Queremos calcular uma média sobre as inscrições totais para cada dia. Supondo que tenhamos uma tabela típica de usuários com uma linha por usuário novo e um timestamp createdat, podemos criar nossa tabela agregada de inscrições como assim: No Postgres e no SQL Server você pode usar isso como um CTE. No MySQL você pode salvá-lo como uma tabela temporária. O Postgres Rolling Average, felizmente Postgre tem funções de janela que são a maneira mais simples de calcular uma média em execução. Essa consulta pressupõe que as datas não possuem lacunas. A consulta está em média nas últimas sete linhas, não nas sete últimas datas. Se seus dados tiverem lacunas, preencha-os com generateseries ou junte-se a uma tabela com linhas de data densa. MySQL Rolling Average O MySQL não possui funções de janela, mas podemos fazer uma computação similar usando auto-junções. Para cada linha da nossa tabela de contagem, nos juntamos a cada linha que foi nos últimos sete dias e leva a média. Esta consulta lida automaticamente com intervalos de data, pois estamos olhando linhas em um intervalo de datas em vez das N linhas anteriores. O SQL Server Rolling Average SQL Server possui funções de janela, portanto, calcular a média móvel pode ser feita no estilo Postgres ou no estilo MySQL. Por simplicidade, estavam usando a versão MySQL com uma auto-união. Isso é conceitualmente o mesmo que no MySQL. As únicas traduções são a função dateadd e explicitamente denominada grupo por colunas. Outras médias Nos concentramos na média de fim de semana de 7 dias nesta publicação. Se quisermos olhar para a média líder de 7 dias, é tão simples quanto classificar as datas na outra direção. Se quisermos ver uma média centrada, use: Postgres: linhas entre 3 anteriores e 3 seguintes MySql: entre signups. date - 3 e signups. date 3 no MySQL SQL Server: entre dateadd (dia, -3, inscrições). Data) e dateadd (dia, 3, signups. date)

No comments:

Post a Comment