Friday 19 May 2017

Sql Server Moving Average Query



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 essa seleção. As 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 anteriores 250 registros. Assim para TransactionID 300, coletar todos os valores de 250 linhas anteriores (exibição é classificada decrescente por TransactionID) e, em seguida, na coluna MovAvg gravar o resultado da média desses valores. Eu estou olhando para coletar dados dentro de um intervalo de registros. Perguntou Oct 28 14 em 20: 58This é uma pergunta Evergreen Joe Celko. Eu ignoro qual plataforma DBMS é usada. Mas, em qualquer caso, Joe foi capaz de responder há mais de 10 anos com o SQL padrão. A tentativa de última 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 Desnormalizar o banco de dados. No entanto, se os dados históricos que estão sendo gravados não vai mudar ea computação da média móvel é cara, você pode considerar usar a abordagem de coluna. SQL consulta Quebra-cabeça: por todos os meios uniforme. Você joga apenas para o balde de peso apropriado, dependendo da distância do ponto de tempo atual. Por exemplo quottake weight1 para datapoints dentro de 24hrs de datapoint atual weight0.5 para datapoints dentro de 48hrsquot. Esse caso importa quanto pontos de dados consecutivos (como 6:12 am e 11:48 pm) estão distantes uns dos outros Um caso de uso que eu posso pensar seria uma tentativa de suavizar o histograma onde quer que os pontos de dados não são densos o suficiente ndash msciwoj May 27 15 at 22:22 Eu não tenho certeza que seu resultado esperado (saída) mostra clássico simples movendo (rolando) média de 3 dias. Porque, por exemplo, o primeiro triplo de números por definição dá: mas você espera 4.360 e sua confusão. No entanto, sugiro a seguinte solução, que usa a função de janela AVG. Essa abordagem é muito mais eficiente (clara e menos intensiva em recursos) do que o SELF-JOIN introduzido 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 dias Moving Average é sem sentido. Respondeu Feb 23 16 at 13:12 Podemos aplicar Joe Celkos suja deixada externa juntar método (como citado acima por Diego Scaravaggi) para responder à pergunta como foi perguntado. Gera a saída solicitada: respondida Jan 9 16 at 0:33 Sua Resposta 2017 Stack Exchange, IncPreviamente nós discutimos como escrever médias de rolamento no Postgres. Pela demanda popular estavam mostrando-lhe como fazer o mesmo no MySQL e 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 ruidoso e difícil de obter informações úteis. Podemos suavizar-lo traçando uma média de 7 dias sobre os dados subjacentes. Isso pode ser feito com funções de janela, self-joins, ou subconsultas correlacionadas - bem cobrir os dois primeiros. Bem começar 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 desloca os picos no gráfico para a direita, uma vez que um grande pico é calculado 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. Assumindo que temos uma tabela típica de usuários com uma linha por novo usuário e um timestamp createdat, podemos criar nossa tabela agregados de inscrições da seguinte forma: No Postgres e SQL Server você pode usar isso como um 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 assume que as datas não têm lacunas. A consulta é a média das últimas sete linhas, não as últimas sete datas. Se seus dados tiverem lacunas, preencha-as com generateseries ou junção contra uma tabela com linhas de data densas. MySQL Rolling Average O MySQL não tem funções de janela, mas podemos fazer um cálculo semelhante usando auto-uniões. Para cada linha em nossa tabela de contagem, juntamos cada linha que estava nos últimos sete dias e tomamos a média. Esta consulta trata automaticamente as lacunas de data, uma vez que estamos a olhar para linhas dentro de um intervalo de datas em vez das N linhas precedentes. SQL Server Rolling Average O SQL Server possui funções de janela, portanto, calcular a média móvel pode ser feita no estilo Postgres ou no estilo MySQL. Para simplificar, estavam usando a versão MySQL com um auto join. Isso é conceitualmente o mesmo que no MySQL. As únicas traduções são a função dateadd e nomeado explicitamente grupo por colunas. Outras médias Nós nos concentramos na média final de 7 dias neste post. Se quiséssemos olhar para a média de 7 dias, é tão simples como classificar as datas na outra direção. Se queremos olhar para uma média centrada, use wed: Postgres: linhas entre 3 precedente 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) AVG (Transact-SQL) ALL Aplica a função de agregação a todos os valores. ALL é o padrão. DISTINCT Especifica que o AVG deve ser executado somente em cada instância exclusiva de um valor, independentemente do número de vezes que o valor ocorre. Expressão É uma expressão da categoria de tipo de dados numérico exata ou aproximada, exceto para o tipo de dados bit. Funções agregadas e subconsultas não são permitidas. OVER (partitionbyclause orderbyclause) partitionbyclause divide o conjunto de resultados produzido pela cláusula FROM em partições para as quais a função é aplicada. Se não for especificado, a função trata todas as linhas do conjunto de resultados da consulta como um único grupo. Orderbyclause determina a ordem lógica na qual a operação é executada. Pedido por cláusula é necessária. Para obter mais informações, consulte Cláusula OVER (Transact-SQL). O tipo de retorno é determinado pelo tipo de resultado avaliado da expressão. Categoria decimal (p, s) Se o tipo de dados de expressão for um tipo de dados de alias, o tipo de retorno também é do tipo de dados de alias. No entanto, se o tipo de dados base do tipo de dados de alias é promovido, por exemplo de tinyint para int. O valor de retorno é do tipo de dados promovido e não o tipo de dados alias. AVG () calcula a média de um conjunto de valores dividindo a soma desses valores pela contagem de valores nonnull. Se a soma exceder o valor máximo para o tipo de dados do valor de retorno um erro será retornado. O AVG é uma função determinística quando usado sem as cláusulas OVER e ORDER BY. Ele é não-determinístico quando especificado com as cláusulas OVER e ORDER BY. Para obter mais informações, consulte Funções determinísticas e não determinísticas. A. Usando as funções SUM e AVG para cálculos O exemplo a seguir calcula as horas de férias médias ea soma de horas de folga que os vice-presidentes de Ciclos de Trabalho Aventuras usaram. Cada uma dessas funções agregadas produz um único valor de resumo para todas as linhas recuperadas. O exemplo usa o banco de dados AdventureWorks2012.

No comments:

Post a Comment