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. As minhas colunas de exibição são as seguintes: TransactionID é exclusivo. Para cada ID de transação. Gostaria de calcular a média do valor da coluna, em relação aos 250 registros anteriores. Então, para TransactionID 300, colete todos os valores das 250 linhas anteriores (a exibição é ordenada por TransactionID) e, em seguida, na coluna MovAvg, escreva o resultado da média desses valores. Estou procurando coletar dados dentro de uma variedade de registros. Perguntou Oct 28 14 em 20: 58Mover média 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 Moeda em movimento 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 associaçã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 verificamos 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 enorme 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. Sinais de compra e venda T-SQL Ma20, Ma50, Ma200. 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 LindI estou tentando criar uma função que calcula uma média móvel com janelas no SQLServer 2008. Eu sou bastante novo no SQL, então estou tendo um pouco de dificuldade. Os dados que eu estou tentando executar a média móvel precisam ser agrupados por dia (são todos os dados de data / hora) e, em seguida, uma janela de variável média média precisa ser aplicada a ele. Eu já tenho uma função que agrupa os dados por dia (e id) que é mostrado na parte inferior. Tenho algumas perguntas: seria melhor chamar a função de agrupamento dentro da função de média móvel ou devo fazê-lo tudo de uma vez. É possível obter a média móvel para as datas de entrada na função, mas voltar n dias para Comece a média móvel para que os primeiros n dias dos dados retornados não tenham 0 para sua média (ou seja, se eles querem uma média móvel de 7 dias de 01-08-2011 a 02-08-2011 que eu comece a média móvel Cálculo em 01-01-2011 para que o primeiro dia que definiu tenha um valor) Estou no processo de olhar para como fazer a média móvel e sei que uma janela em movimento parece ser a melhor opção (currentSum prevSum todayCount - NthDayAgoCount) nDays, mas ainda estou trabalhando para descobrir a implementação do SQL. Eu tenho uma função de agrupamento que se parece com isso (algumas variáveis removidas para fins de visibilidade): O que retorna uma tabela como assim: EDIT: Para responder a primeira pergunta que eu fiz: acabei criando uma função que declarou uma tabela temporária e inseriu os resultados A partir da função de contagem, usou o exemplo do user662852 para calcular a média móvel. Tire o intervalo de datas codificado da sua consulta. Escreva a saída (como a sua amostra no final) para uma tabela temporária (eu liguei para visitas abaixo). Experimente essa auto-união com a tabela temporária: EDIT: Eu não tive espaço suficiente em comentários para dizer isso em resposta à sua pergunta: minha união é um pouco cartesiana porque usa um entre na restrição de junção. Cada registro na lista está subindo contra todos os outros registros, e então eu quero aqueles em que a data que eu relatei está entre um limite menor (-7) dias e hoje. Cada data data está disponível para listar a data, esta é a chave da sua pergunta. Eu poderia ter escrito a condição de junção. Mas o que realmente aconteceu foi que eu testei isso porque não retorna registros porque a sintaxe está entre LOW e HIGH. Eu falei com 0 registros e troquei os argumentos, isso é tudo. Experimente o seguinte, veja o que quero dizer: Esta é a junção cartesiana para apenas um arquivo de listagem: Compare isso com a condição de associação real Veja como a data da lista está entre datadate e dataplus6 em todos os registros
No comments:
Post a Comment