Sunday 6 August 2017

Moving Average Function In Sql


Média móvel ponderada em T-SQL Em uma publicação anterior, demonstrei o cálculo de médias móveis em T-SQL. No entanto, há uma grande desvantagem com médias móveis simples. As mudanças de preço no início do período têm a mesma importância que as mudanças de preços mais recentes. De alguma forma, you8217d gosta de atribuir pesos diferentes às mudanças de preços, de modo que as mudanças mais recentes tenham mais peso. Para isso, pode-se calcular uma média móvel ponderada (WMA). Nesta postagem do blog, vou mostrar dois métodos diferentes para calcular o WMA, que pode ser usado no SQL Server 2005 e posterior e a outra versão é para versões do SQL Server anteriores a 2005. Para calcular o peso relativo de cada mudança de preço, nós Precisa conhecer a posição de cada variação de preço em relação ao dia calculado. Por causa disto, uma função de janela não pode ser usada. Não é possível obter informações das linhas individuais na janela. No exemplo abaixo, calcularemos a média móvel ponderada por 9 dias (WMA9). O exemplo usa o TAdb. Um script para criar TAdb pode ser encontrado aqui. Independentemente da versão do SQL Server, para cada linha, precisamos acessar as 8 linhas anteriores, 9 com a linha atual incluída. Essas 9 linhas serão a janela que contém nossas mudanças nos preços. Cada linha dessa janela receberá um peso linear que está aumentando com a mesma quantidade para cada linha até a linha atual. O peso para cada linha será calculado usando a posição da linha da janela em relação à linha atual. Let8217s dizem que queremos calcular WMA para a 9ª linha (citações de TAdb StockId 1): 1 30,02 30,02 2 30,33 60,66 3 30,33 90,99 4 30,44 121,76 5 30,24 151,20 6 30,27 181,62 7 29,87 209,09 8 30,00 240,00 9 30,02 270,18 A soma do exposto acima é 1355,52. Isso é dividido pela soma dos pesos, que é 123456789 45. O WMA9 para a linha 9 é 1355,52 45 30,12. Se você deseja calcular o WMA além de 9 dias, use o seguinte T-SQL (obtenha a função GetNums2 aqui) para obter o divisor pelo período de tempo (por exemplo, 45 para 9 dias WMA): divisores de média móvel média (WMA) ponderada Média móvel ponderada SQL Server 2005 e posterior Esta versão usa um CTE para calcular o WMA: Resultado por 9 dias Média móvel ponderada (WMA9) Nos resultados acima, você pode ver o WMA9 para a linha 9 é 30,12, conforme calculado anteriormente. Média móvel ponderada antes do SQL Server 2005 A única diferença entre a versão do SQL Server 2005 e esta é o uso de uma expressão de tabela comum. A versão pré 2005 usa tabelas reais em vez de CTE8217s: Desempenho Ao calcular uma média móvel simples e usando o SQL Server 2012 ou posterior, uma grande melhoria no desempenho pode ser vista ao usar funções de janela em comparação com os metohods alternativos usados ​​em versões antigas do SQL Server . Os cálculos das médias móveis ponderadas no entanto, can8217t usam funções de janelas da mesma maneira. Uma comparação entre a versão do SQL Server 2005 do WMA mostra uma pequena melhoria em relação às versões usadas em versões antigas do SQL Server: T-SQL WMA SQL Server 2005 em comparação com a versão anterior a 2005. Por causa dos cálculos onerosos envolvidos na WMA, pode ser uma boa idéia persistir os resultados. WMA são usados ​​da mesma forma que a SMA, na análise de tendências. A WMA tem mais peso nas recentes mudanças de preços no entanto. 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. Anteriormente discutimos como escrever médias dinâmicas no 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