Thursday 28 December 2017

Função de oracle média móvel


Média rolante com funções analíticas Oracle Este pequeno exemplo irá demonstrar como usar as funções analíticas Oracles para obter a média móvel. Primeiro, você precisa criar e carregar uma tabela que contenha uma média média de cada mês em Edimburgo nos anos 1764-1820. O script para fazer isso pode ser encontrado aqui. Depois de preencher esta tabela, use esta declaração para encontrar a temperatura média nos últimos 12 meses para cada mês no conjunto de resultados: O resultado (encurtado) é: as segunda e terceira colunas são o mês e o ano. A primeira coluna é a temperatura média para este mês, a última coluna é a média das temperaturas médias atuais e dos últimos 11 meses. Houve uma boa pergunta sobre a OTN hoje sobre se há uma função Oracle padrão para calcular a média móvel exponencial. A resposta é que não há essa função, mas com a cláusula modelo, você pode calcular isso muito facilmente. E é um ótimo exemplo do que quero dizer com um número variável de cálculos com base em valores calculados, escrito na minha terceira parte do tutorial da cláusula modelo. Antes de hoje, nem sabia o que era uma média móvel exponencial. Você pode ler mais sobre isso aqui na Wikipedia ou aqui com um bom exemplo. Do primeiro link: uma média móvel exponencial (EMA), aplica fatores de ponderação que diminuem exponencialmente. A ponderação para cada ponto de dados mais antigo diminui exponencialmente, dando muito mais importância às observações recentes, enquanto ainda não descarta as observações antigas inteiramente. A partir do 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 Constante de suavização P EMA anterior (O primeiro EMA no intervalo a ser calculado é Arbitrária e pode ser o valor de dados original correspondente ou, muitas vezes, 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 Combine o exemplo no link. Eu compus os números do produto B. Aqui está a consulta da cláusula do modelo que implementa a fórmula. Observe como a fórmula se traduz diretamente na única e única regra da cláusula do modelo. A constante de suavização K está configurada Para .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 encontrar algo mais abrangente. 5 comentários: 11.2 recursos em uso com isso como (selecione o produto 39A39 . Data 392009-01-0139 mês, 10 quantidade de união dupla, todos selecionados 39A39, data 392009-02-0139, 15 de dupla união, todos selecionam 39A39, data 392009-03-0139, 17 de união dupla, todos selecionam 39A39, data 392009-04-0139, 20 de união dupla Todos selecionam 39A39, data 392009-05-0139, 22 de dupla união, todos selecionam 39A39, data 392009-06-0139, 20 de dupla união, selecione tudo 39A39, data 392009-07-0139, 25 de dupla união, selecione tudo 39A39, data 392009-08-0139, 27 de dupla união, todos selecionam 39A39, data 392009-09-0139, 30 de união dupla, todos selecionados 39A39, data 392009-10-0139, 35 de união dupla, todos selecionados 39A39, data 392009-11-0139 , 37 de dupla união, todos selecionam 39A39, data 392009-12-0139, 40 de dupla união, todos selecionam 39B39, data 392009-01-0139, 0 de dupla união, todos selecionam 39B39, data 392009-02-0139, 50 de dupla união Todos selecionam 39B39, data 392009-03-0139, 10 da união dupla, selecione 39B39, data 392009-04-0139, 40 da união dupla, selecione 39B39, data 392009-05-0139, 15 da dupla união, selecione tudo 39B39, data 392009-06-0139, 35 de União dupla, todos selecionam 39B39, data 392009-07-0139, 30 de dupla união, todos selecionam 39B39, data 392009-08-0139, 30, de dupla união, todos selecionam 39B39, data 392009-09-0139, 20, de dupla união, todos os selecionados 39B39 , Data 392009-10-0139, 20 da união dupla, selecione 39B39, data 392009-11-0139, 20 da união dupla, selecione 39B39, data 392009-12-0139, 20 a partir de dual), rns como (selecione isso. . Rownumber () over (partição por produto ordem por mês) rn -. 2 (1count () over (partição por produto)) k. 0,5 k do dat), res (produto, mês, quantidade, rn, x) como (selecione r. product, r. month, r. amount, r. rn, r. mount x de rns r onde rn 1 union seleciona todos Ns. prodt, ns. month, ns. amount, ns. rn, ns. k (ns. amount - es. x) es. xx de rns ns, res es onde ns. rn es. rn 1 e ns. product es. produto) selecione o produto, o mês, o montante, o rn, a rodada (x, 3) EMA a partir do pedido de res por produto, mês após a computação do formulário fechado, criei o seguinte código que, se mais como uma ofuscação do que qualquer coisa abrangente. A idéia é criar múltiplos em execução usando uma concatenação de string e a funcionalidade xml-eval. As formas fechadas dos casos especiais apenas precisam de somas em execução. Há um caso geral e dois casos especiais que são muito mais fáceis: com t1 como (selecionar produto, mês, quantidade, quantidade ci, rownumber () over (partição por ordem do produto por mês) rn, --2 (1 rownumber () over (Partição por ordem de produto por mês)) ki 0,5 ki de vendas), t2 como (selecione produto, mês, quantidade, (caso quando rn 1 e 1 mais ki end ci) ai, caso quando rn 1 e mais 1 (1 - Ki) fim bi de t1), t3 como (SELECIONE o produto, MONTH, amount, ai, xmlquery (REPLACE (wmconcat (bi) over (PARTITION BY product ORDER BY MONTH filas ENTRE INCLUÍDO precedente AND ACTUAL), 39,39, 3939 ) VOLTANDO o conteúdo).getnumberval () mi FROM t2), t4 as (selecione o produto, o mês, o montante, o mi) xi do t3) SELECIONE o produto, MONTH, amount, round (mi SUM (xi) over (PARTITION POR produto ORDER BY MONTH filas ENTRE INCLINADO ANTERIOR E LIGAÇÃO ATUAL), 3) ema DE t4 Caso especial K 0,5: com t1 como (selecionar produto, mês, quantidade, rownumber () sobre (partição por ordem de produto por mês) rn, quantidade Poder (2, nvl (nullif (r (Partição por produto ordem por mês) - 1, 0), 1)) ci de vendas) selecione produto, mês, quantidade, rodada (soma (ci) sobre (partição por ordem do produto por mês linhas entre ilimitado anterior E linha atual) potência (2, rn), 3) ema de t1 Caso especial K 2 (1 i): com t1 como (selecionar produto, mês, quantidade, rownumber () sobre (partição por produto ordem por mês) rn, Quantidade de rownumber () por cima (partição por ordem de produto por mês) ci de vendas) selecione produto, mês, quantidade, rodada (soma (ci) sobre (partição por ordem de produto por mês linhas entre linha não limitada precedente e atual) 2 (rn ( Rn 1)), 3) ema de t1 I39ll publicar a prova do formulário fechado se alguém estiver interessado nela. Este é um ótimo exemplo de quotfun com SQLquot :-) Uma combinação de XMLQuery, wmconcat indocumentado e funções analíticas com a cláusula de janela. Eu gosto disso. Embora não seja tão abrangente como a variante da cláusula modelo e os Rafu39s recursivos com um, como você disse a si mesmo. E com certeza, gostaria de ver a prova da forma fechada. Abordei outra questão: como otimizar a constante de suavização SELECT k - constante de suavização. Mse - erro quadrado médio FROM (SELECIONE DE VENDAS MODELO DIMENSÃO POR (produto. ROWNUMBER () OVER (PARTITION BY product ORDER BY month ASC) rn) MEDIDAS (montante - valor das vendas mês - mês. 0 AS C. 0 AS P. 0 AS X. 0 AS SE - erro ao quadrado - - linha de trabalho e atributos - a) linha de trabalho é o produto 39X39, rn 1 - b) os atributos de trabalho são os seguintes:. 0 AS SSE - sum SE para todos os meses de produtos. 0 AS MSE - significa SSE para todos os produtos. 0 AS k - para todos os meses de produtos. 0 AS PreMSE - MSE anterior de k39s para todos os meses de produtos. 0 AS diff - entre MSE atual e anterior. 0,1 AS delta - incremento inicial. 0 AS priorpt - ponto de partida inicial -) REGRAS ITERATE (99) ATÉ (abs (diff39A39,1) lt 0.00010) (Cany, rn amountcv (), cv (). K39A39,1 priorpt39A39,1 delta39A39,1. Xany Rn ORDEM POR produto, rn ASC COALESCE (K39A39,1 Ccv (), cv () (1-K39A39,1) Xcv (), cv () - 1, Ccv (), cv ()). Pproduct, rn Xcv (), Cv () - 1. SEproduct, rn POWER (Ccv (), cv () - Xcv (), cv () - 1, 2). SSE39A39,1 SUM (SE) qualquer, qualquer. MSE39A39,1 SUM (SE) qualquer, qualquer 24. Diff39A39,1 CASE iterationnumber QUANDO 0 então NULL ELSE preMSE39A39,1 - MSE39A39,1 END. PreMSE39A39,1 MSE39A39,1. Delta39A39,1 CASO QUANDO diff39A39,1 lt 0 então - abs (delta39A39, 12) ELSE abs (delta39A39,1) END. Priorpt39A39,1 K39A39,1)) onde o produto 39A39 e rn 1 K MSE ---------- ---------- .599999237 174.016094 Usar uma média móvel simples para suavizar os dados é uma técnica bastante popular. É muito ruim o principal exemplo 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, isto é: calcular a média móvel de todas as vendas de produtos, por mês, no ano 2000. Heres o que faz É complexo: duas referências à função AVG (), um GRUPO BY (que, por si só, faz praticamente qualquer SELECIONAR um scratcher principal),. Uma cláusula WINDOW Stealth uma cláusula WINDOW que nem usa a palavra-chave WINDOW. Então, para os não iniciados (as pessoas que precisam de exemplos mais do que ninguém), não é óbvio que um WINDOW esteja envolvido. Não é apenas qualquer cláusula WINDOW, tenha em atenção você, mas que inclui todos os componentes que você pode codificar em uma cláusula WINDOW: a PARTITION BY, RANGE. Não uma cláusula ROWS simples, mas uma cláusula RANGE completo, uma que possui um relacionamento íntimo com o ORDER BY. Eu sei o que é uma linha, mas o que o redacto é uma GAMA Mas aguarde, há mais: a escolha de GAMA sobre ROWS neste exemplo é fundamental para a operação correta da consulta. (Para uma discussão mais completa sobre este exemplo específico, veja o Exemplo 23 - Computação de uma Média em Movimento no excelente papel branco OLAP de Glenn Paulleys). Agora, vamos voltar à pista: Uma Média Mínima Realmente Simples O seguinte exemplo mostra 10 dias de valor Dados em conjunto com a média móvel do valor de hoje e dos dias de ontem: a cláusula WINDOW nas linhas 21 a 23 define uma janela em movimento que contém duas linhas: a linha de hoje (LUGAR ATUAL) e a linha de ontem (1 PRECEDING): a cláusula WHINDOW ORDER BY determina o que PRECEDING significa (a linha anterior por t. entrydate) ea cláusula ROWS determina o tamanho da janela (sempre duas linhas). A expressão AVG (t. value) OVER twodays na linha 19 refere-se à cláusula WINDOW pelo nome, e informa ao SQL Anywhere que calcula a média dos dois valores de t. value que existem na janela deslizante de 2 filas, para cada um Linha no conjunto de resultados. Então, para 2017-02-02 a média de 10 e 20 é 15.000000, para 2017-02-03 a média de 20 e 10 é 15.000000, para 2017-02-04 a média de 10 e 30 é 20.000000, para 2017- 02-10 a média de 10 e 60 é de 35.000000. Ops, e a primeira linha A linha 2017-02-01 não possui uma linha PRECEDING, então qual é a média sobre a janela móvel De acordo com o documento branco de Glenn Paulleys no caso de uma janela em movimento, presume-se que as linhas que contenham Null Os valores existem antes da primeira linha, e após a última linha, na entrada. Isso significa que quando a janela de mudança tem 2017-02-01 como a CORRENTE ATUAL, a 1 linha PRECEDING contém valores NULL. E quando o SQL Anywhere calcula um AVG () que inclui um valor NULL, ele não conta o NULL. Não no numerador ou no denominador ao calcular a média. Sua prova: é por isso que twodayaverage 10.000000 para a primeira linha 2017-02-01. Postado por Breck Carter às 15:47

No comments:

Post a Comment