Wednesday, 18 April 2018

Calculate moving average in sql


Quando eu tive um problema parecido, acabei usando tabelas temporárias por várias razões, mas isso tornou tudo muito mais fácil. O que eu fiz parece muito parecido com o que você está fazendo, no que diz respeito ao esquema. Torne o esquema algo como ID identity, startdate, enddate, value. Ao selecionar, faça uma média de subseleção dos 20 anteriores com base no ID de identidade. Só faça isso se você já estiver usando tabelas temporárias por outros motivos (eu acertei as mesmas linhas várias vezes para diferentes métricas, então foi útil ter o pequeno conjunto de dados). Na minha experiência, o Mysql a partir de 5.5.x tende a não usar índices em selects dependentes, seja uma subconsulta ou junção. Isso pode ter um impacto muito significativo no desempenho, em que os critérios de seleção dependentes são alterados em todas as linhas. A média móvel é um exemplo de uma consulta que se enquadra nessa categoria. O tempo de execução pode aumentar com o quadrado das linhas. Para evitar isso, escolha um mecanismo de banco de dados que possa executar pesquisas indexadas em seleções dependentes. Eu acho que o postgres funciona efetivamente para esse problema. respondido o 2 de julho no 8:01 sua resposta 2016 pilha troca, IncAnteriormente nós discutimos como escrever as médias de rolamento no Postgres. Por demanda popular estavam mostrando como fazer o mesmo no MySQL e no SQL Server. Bem, cubra como anotar gráficos barulhentos como este: Com uma linha média anterior de 7 dias como esta: A grande idéia Nosso primeiro gráfico acima é bastante barulhento e difícil de obter informações úteis. Podemos suavizá-lo plotando uma média de 7 dias sobre os dados subjacentes. Isso pode ser feito com funções de janela, auto-uniões ou subconsultas correlacionadas - bem, cubra as duas primeiras. 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 altera os picos no gráfico para a direita, pois um grande pico é calculado nos sete dias seguintes. Primeiro, crie uma tabela de contagem intermediária Queremos calcular uma média sobre o total de inscrições para cada dia. Supondo que temos uma tabela típica de usuários com uma linha por novo usuário e um registro de data e hora criado, podemos criar nossa tabela de cadastros da seguinte forma: No Postgres e no SQL Server, você pode usar isso como CTE. No MySQL você pode salvá-lo como uma tabela temporária. Postgres Rolling Average Felizmente Postgres tem funções de janela, que são a maneira mais simples de calcular uma média em execução. Esta consulta pressupõe que as datas não possuem intervalos. A consulta tem média nas últimas sete linhas, não nas últimas sete datas. Se os dados tiverem intervalos, preencha-os com gereries ou junte-se a uma tabela com linhas de datas densas. MySQL Rolling Average O MySQL não possui funções de janela, mas podemos fazer um cálculo similar usando self-joins. Para cada linha na nossa tabela de contagem, nós nos juntamos a cada linha que estava nos últimos sete dias e pegamos a média. Essa consulta trata automaticamente dos intervalos de datas, pois estamos analisando as linhas dentro de um período, em vez das linhas N anteriores. Média de rolagem do SQL Server O SQL Server possui funções de janela, portanto, calcular a média de rolagem pode ser feito no estilo Postgres ou no estilo MySQL. Por simplicidade, estavam usando a versão do MySQL com um self join. Isso é conceitualmente o mesmo que no MySQL. As únicas traduções são a função dateadd e explicitamente nomeadas grupo por colunas. Outras Médias Nós nos concentramos na média móvel de 7 dias neste post. Se quiséssemos olhar para a média de 7 dias, é tão simples quanto ordenar as datas na outra direção. Se quisermos olhar para uma média centralizada, devemos usar: Postgres: linhas entre 3 precedentes e 3 seguindo MySql: entre signups. date - 3 e signups. date 3 no MySQL SQL Server: entre dateadd (dia, -3, inscrições. date) e dateadd (dia, 3, signups. date) 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 dessa seleção. Minhas colunas de exibição são as seguintes: TransactionID é exclusivo. Para cada TransactionID. Eu gostaria de calcular a média para o valor da coluna, sobre os 250 registros anteriores. Portanto, para TransactionID 300, colete todos os valores das 250 linhas anteriores (a visualização é classificada como decrescente por TransactionID) e, na coluna MovAvg, grave o resultado da média desses valores. Eu estou olhando para coletar dados dentro de um intervalo de registros. perguntou 28 de outubro 14 às 20:58

No comments:

Post a Comment