Monday 30 October 2017

Pl sql moving average no Brasil


Havia uma pergunta agradável em OTN hoje sobre se há uma função padrão de Oracle para calcular a média móvel exponencial A resposta é que não há tal função, mas com a cláusula modelo, você pode calcular muito fácil E é um grande exemplo de O que eu quero dizer com o número variável de cálculos baseados em valores calculados, escrito na minha terceira parte do tutorial de cláusula modelo. Antes de hoje, eu nem sabia o que uma média móvel exponencial era exatamente Você pode ler mais sobre ele aqui na Wikipedia ou aqui Com um bom exemplo A partir do primeiro link. Uma média móvel exponencial EMA, aplica-se fatores de ponderação que diminuem exponencialmente A ponderação de cada ponto de dados mais antigos diminui exponencialmente, dando muito mais importância às observações recentes ainda não descartando observações mais antigas inteiramente. Desde o segundo link . A fórmula para o cálculo de uma média móvel exponencial EMA é. X EMA atual ou seja, EMA a ser calculado. C Valor de dados original atual. K Suavização C Onstant. P Anterior EMA. O primeiro EMA no intervalo a ser calculado é arbitrário e pode ser o valor de dados original correspondente ou, freqüentemente, um valor de Média Móvel Simples. K Smoothing Constant 2 1 n. E esta fórmula é seguida por um exemplo que eu estendi um pouco, Usando esta tabela. Os registros do produto A correspondem ao exemplo no link que compus os números do produto B Aqui está a consulta da cláusula modelo que implementa a fórmula Observe como a fórmula se traduz diretamente para a regra única da cláusula modelo A A constante de suavização K é definida como 5, com base em uma janela de valores n igual a 3. Desafio tente isso sem a cláusula do modelo e veja se você pode chegar a algo mais abrangente.11 2 características em use. with dat como select A data do produto 2009-01-01 mês, 10 montante de dupla união todos selecionam A, data 2009-02-01, 15 de dupla união todos selecionam A, data 2009-03-01, 17 de dual union todos selecionam A, data 2009-04 -01, 20 de dupla união todos selecionam A, data 2009-05-01, 22 de dupla união todos seleto A, data 2009-06-01, 20 de dupla união todos selecionam A, data 2009-07-01, 25 de dupla união todos selecionam A, data 2009-08-01, 27 de dual union todos selecionam A, data 2009- 09-01, 30 de dual union all select A, date 2009-10-01, 35 de dual union all select A, date 2009-11-01, 37 de dual union all select A, date 2009-12-01, 40 De dupla união todos selecionar B, data 2009-01-01, 0 de dupla união todos selecionar B, data 2009-02-01, 50 de dupla união todos selecionar B, data 2009-03-01, 10 de dupla união todos selecionar B, data 2009-04-01, 40 de dupla união todos selecionam B, data 2009-05-01, 15 de dupla união todos selecionam B, data 2009-06-01, 35 de dupla união todos selecionam B, data 2009- 07-01, 30 de dupla união todos selecionam B, data 2009-08-01, 30 de dupla união todos selecionam B, data 2009-09-01, 20 de dupla união todos selecionam B, data 2009-10-01, 20 De dupla união todos selecionam B, data 2009-11-01, 20 de dupla união todos selecionam B, data 2009-12-01, 20 de dual, rns como data rownumber seleto Por ordem de produto por mês rn - 2 1 contagem por partição por produto k 0 5 k de dat, res produto, mês, quantidade, rn, x como selecionar x de rns r onde rn 1 unir todas as seleções Xx de rns ns, res onde 1 e selecione o produto, mês, quantidade, rn, rodada x, 3 EMA de res ordem por produto, month. after computando o formulário fechado eu vim com o seguinte código que se mais como uma ofuscação Que nada abrangente A idéia é criar múltiplos correndo usando uma concatenação de Cadeia de caracteres e xml-eval-funcionalidade As formas fechadas dos casos especiais só precisam de somas correntes. Há um caso geral e dois casos especiais que são muito mais fáceis. Com t1 como selecionar Produto, mês, quantia, quantia ci, número de rownumber sobre a divisão por ordem de produto por mês rn, --2 1 rownumber sobre a divisão por produto ordem por mês ki 0 5 ki das vendas, t2 como produto seleto, mês, quantidade, caso quando rn 1 então 1 else ki end ci ai, caso quando rn 1 então 1 else 1 - ki end bi de t1, t3 como SELECT produ Ct, MONTH, amount, ai, xmlquery SUBSTITUIR wmconcat bi sobre PARTITION BY product ORDER BY MONTH linhas entre ENTRADA não precedida e corrente ATUAL,, RETURNING mi FROM t2, t4 como produto selecionado, mês, quantidade, mi, ai mi xi de t3 SELECT produto, MÊS, quantidade, rodada mi SUM xi sobre PARTIÇÃO POR produto ORDER BY MONTH linhas entre ENTRADA ilimitada precedente E CORRENTE, 3 ema FROM t4.Caso especial K 0 5.com t1 como produto selecionado, mês, quantidade, rownumber sobre partição Por ordem de produto por mês rn, quantidade de energia 2, nvl nullif rownumber sobre partição por produto ordem por mês - 1, 0, 1 ci de vendas selecione produto, mês, montante, rodada ci sobre partição por ordem de produto por mês linhas entre ilimitado Precedente e atual 2, rn, 3 ema de t1.Caso especial K 2 1 i. com t1 como produto selecionado, mês, quantidade, rownumber sobre partição por produto ordem por mês rn, quantidade rownumber sobre partição por produto ordem por mês Ci das vendas selecione o produto, o mês, o montante, a soma redonda ci over partit Íon por ordem de produto por linhas de mês entre linha não precedida e atual 2 rn 1, 3 ema de t1.I vou postar a prova do formulário fechado se alguém está interessado ne it. This é um grande exemplo de diversão com SQL. A Combinação de XMLQuery, o wmconcat indocumentado e funções analíticas com a cláusula windowing Eu gosto dele Embora não seja tão abrangente quanto a variante de cláusula modelo eo Rafu s recursivo com um, como você disse yourself. And certeza, eu gostaria de ver A prova da forma fechada. I abordou outra questão como otimizar a suavização constante. SELECT k - suavização constante mse - erro quadrado médio FROM SELECT FROM vendas MODELO DIMENSÃO POR produto ROWNUMBER SOBRE PARTIÇÃO POR produto ORDEM POR mês ASC rn MEDIDA quantidade - valor de vendas mês - mês 0 AS C 0 AS P 0 AS X 0 AS SE - erro quadrado - - linha de trabalho e atributos - uma linha de trabalho é produto X, rn 1 - b atributos de trabalho são como Segue 0 AS SSE - soma SE para todos os produtos meses 0 AS MSE - significa SSE para todos os pr Oducts meses 0 AS k - para todos os produtos meses 0 AS PreMSE - antes ks MSE para todos os produtos meses 0 AS diff - entre MSE actual e anterior 0 1 AS delta - incremento inicial 0 AS prior - ponto de partida inicial - - REGRAS ITERATE 99 UNTIL abs dif A, 1 0 00010 C qualquer, rn quantidade cv, cv KA, 1 prioridade A, 1 delta A, 1 X qualquer, rn ORDEM BY produto, rn ASC COALESCE KA, 1 C cv, cv 1 - KA, 1 X cv, cv-1, C cv, cv P produto, rn X cv, cv-1 SE produto, rn POWER C cv, cv - X cv, cv -1, 2 SSE A, 1 SUM SE any , Qualquer MSE A, 1 SUM SE qualquer, qualquer 24 diff A, 1 CASE iterationnumber QUANDO 0 então NULL ELSE preMSE A, 1 - MSE A, 1 END preMSE A, 1 MSE A, 1 delta A, 1 CASO WHEN diff A, 1 0 THEN - abs delta A, 1 2 ELSE abs delta A, 1 END prioridade A, 1 KA, 1 onde produto A e rn 1 K MSE ---------- -------- - 599999237 174 016094.Seu grupo por é o que agrega sua média, e está agrupando por toda a tabela estou assumindo que você fez isso para permitir a seleção de tudo Basta mover o seu avg em outra subconsulta, remover O grupo overarching por e que deve resolvê-lo. Quando você executar a instrução de custo SELECT AVG básica é naturalmente agrupando pela coluna custo especificado neste caso, como é isso que você está solicitando eu sugeriria ler mais sobre GROUP BY e agregados para Obter uma melhor compreensão sobre o conceito Isso deve ajudá-lo mais do que apenas uma solução simples. A resposta abaixo é realmente a partir da resposta de David Faz uso das funções analíticas Basicamente, o que está acontecendo é que em cada chamada AVG, você está dizendo o motor O que usar para a função neste caso, nada Um writeup decente em funções analíticas pode ser encontrado aqui e aqui e muito mais com um google sobre o assunto. No entanto, se o seu motor SQL permite variáveis, você poderia facilmente fazer o abaixo Resposta Eu realmente prefiro isso para futura legibilidade de manutenção A razão é que uma variável com um bom nome pode ser muito descritivo para futuros leitores do código, versus uma função analítica que exige um pouco mais E trabalhar para ler especialmente se você não entender a função over. Also, esta solução duplica a mesma consulta duas vezes, por isso pode valer a pena armazenar sua média em uma variável SQL Então você ca alterar a sua declaração para simplesmente usar essa média global. É variáveis ​​no SQL-Server você terá que adaptá-lo para sua própria instância de SQL. This solução vai ler muito mais limpo para futuros leitores do seu SQL, too. I m certeza de que a consulta de David é pelo menos tão eficiente e não Exigem o uso de um bloco PL SQL que exige que você coloque o resultado do SELECT em variáveis ​​- ele não será exibido da maneira que você escreveu ele realmente eu acho que não iria mesmo correr E além da consulta duplicada será executado apenas uma vez Oracle Eu tenho certeza que o otimizador é inteligente o suficiente para detectar esse ahorsewithnoname Mar 10 12 às 16 21. Eu aprecio a sua explicação, mas o bloco PL SQL é simplesmente errado Essa abordagem nunca funcionará no Oracle Se você don t quer repetir o avg Consulta, use a abordagem com t Ele função analítica ou a solução de junção cruzar ahorsewithnoname Mar 10 12 em 16 29.Usando uma média móvel simples para suavizar os dados é uma técnica bastante popular é muito ruim o exemplo primário na Ajuda do SQL Anywhere está longe de ser simples O que torna esse exemplo Tão complexo Além da declaração do problema, que é calcular a média móvel de todas as vendas de produtos, por mês, no ano 2000.Aqui está o que torna complexo. two referências à função AVG. um GRUPO POR que por si só faz apenas cerca de Qualquer SELECT um head-scratcher. Uma cláusula WINDOW stealth. a cláusula WINDOW que doesn t mesmo usar a palavra-chave WINDOW para os não iniciados as pessoas que precisam de exemplos mais do que ninguém, não é óbvio que um WINDOW está envolvido em tudo. Não apenas qualquer cláusula WINDOW, Mas uma que inclui cada componente único que você pode codificar em uma cláusula WINDOW. a PARTITION BY. a RANGE não uma cláusula ROWS simples, mas full-blown cláusula RANGE, um que tem um relacionamento íntimo com o ORDER BY eu sei o que é uma linha, Mas o que o redigido é um RANGE. But esperar, há s mais A escolha de RANGE sobre ROWS neste exemplo é fundamental para a operação correta da consulta para uma discussão mais completa deste exemplo específico, veja Exemplo 23 - Computing a Moving Average Em Glenn Paulley s excelente OLAP white paper Agora, vamos voltar à pista. Realmente Realmente simples Moving Average. O exemplo a seguir exibe 10 dias de dados em conjunto com a média móvel de hoje s valor e ontem s A cláusula WINDOW em linhas 21 a 23 Define uma janela em movimento que contém duas linhas de linha de hoje s row ROUND CURRENT e ontem linha s 1 PRECEDING. the WINDOW ORDER BY cláusula determina o que PRECEDING significa a linha anterior por and. the ROWS cláusula determina o tamanho da janela sempre duas linhas. A expressão AVG OVER twodays na linha 19 refere-se à cláusula WINDOW por nome, e ele diz ao SQL Anywhere para calcular a média dos dois valores de que existem na janela deslizante de 2 linhas, para cada linha no conjunto de resultados. Assim, para 2017 -02-02 a média de 10 e 20 é 15 000000.for 2017-02-03 a média de 20 e 10 é 15 000000.for 2017-02-04 a média de 10 e 30 é 20 000000.for 2017-02 -10 a média de 10 e 60 é 35 000000.Oops, que sobre a primeira fileira. A linha 2017-02-01 não tem uma linha PRECEDING, então qual é a média sobre a janela em movimento. De acordo com Glenn Paulley s branco Papel no caso de uma janela em movimento, assume-se que as linhas que contêm valores Nulos existem antes da primeira linha, e depois da última linha, no inpu T. Isso significa que quando a janela em movimento tem 2017-02-01 como ROUND CURRENT, a linha 1 PRECEDING contém valores NULL e quando o SQL Anywhere calcular um AVG que inclui um valor NULL, ele não conta o NULL em todos os não no Numerador ou no denominador ao calcular a média Aqui é prova Isso é por que twodayaverage 10 000000 para a primeira linha 2017-02-01.Postado por Breck Carter em 3 47 PM.

No comments:

Post a Comment