Si vous voyez ce message, votre navigateur a désactivé ou ne prend pas en charge JavaScript. Pour utiliser toutes les fonctionnalités de ce système d'aide, telles que la recherche, votre navigateur doit avoir le support JavaScript activé. Moyennes de déplacement pondérées avec des moyennes mobiles simples, chaque valeur de données dans la quotvindow dans laquelle le calcul est effectué a une signification ou un poids égal. Il est souvent le cas, surtout dans l'analyse des données financières, que plus de données chronologiquement récentes devraient avoir un poids plus important. Dans ces cas, la fonctionnalité Moyenne mobile pondérée (ou Moyenne mobile exponentielle - voir la rubrique suivante) est souvent préférée. Pour calculer une moyenne mobile pondérée: Calculez le nombre d'intervalles de données participant au calcul de la moyenne mobile (c.-à-d. La taille de la fenêtre de calcul). Si la fenêtre de calcul est dite n, alors la valeur de données la plus récente dans la fenêtre est multipliée par n, la suivante la plus récente multipliée par n-1, la valeur précédant celle multipliée par n-2 et ainsi de suite pour toutes les valeurs dans la fenêtre. Divisez la somme de toutes les valeurs multipliées par la somme des poids pour donner la moyenne mobile pondérée sur cette fenêtre. Placez la valeur de la moyenne mobile pondérée dans une nouvelle colonne en fonction du positionnement des moyennes de fuite décrites ci-dessus. Pour illustrer ces étapes, considérez si une moyenne mobile pondérée de 3 mois des ventes en décembre est requise (en utilisant le tableau des valeurs de ventes ci-dessus). Le terme quot3-monthquot implique que le calcul quotwindowquot est 3, donc l'algorithme de calcul de moyenne mobile pondérée pour ce cas devrait être: Ou, si une moyenne mobile pondérée de 3 mois a été évaluée sur l'ensemble de la gamme originale de données, les résultats seraient : Moyenne mobile pondérée de 3 mois Moyenne mobile exponentielle Il y avait une question gentille sur OTN aujourd'hui au sujet de s'il y a une fonction standard d'Oracle pour calculer la moyenne mobile exponentielle. La réponse est qu'il n'existe pas de telle fonction, mais avec la clause modèle, vous pouvez calculer très facilement. Et c'est un excellent exemple de ce que je veux dire avec le nombre variable de calculs basés sur des valeurs calculées, écrit dans ma troisième partie du tutoriel de la clause modèle. Avant aujourd'hui, je ne savais même pas ce qu'est une moyenne exponentielle mobile était exactement. Vous pouvez en lire plus ici sur Wikipedia ou ici avec un bel exemple. Du premier lien: Une moyenne mobile exponentielle (EMA), applique des facteurs de pondération qui diminuent exponentiellement. La pondération de chaque point de données plus ancien diminue de façon exponentielle, donnant beaucoup plus d'importance aux observations récentes tout en ne rejetant pas entièrement les observations plus anciennes. A partir du deuxième lien: La formule pour calculer une moyenne mobile exponentielle (EMA) est: X EMA courante (c.-à-d. EMA à calculer) C Valeur de données d'origine actuelle K Constante de lissage P EMA précédente (La première EMA de la plage à calculer est K Smoothing Constant 2 (1 n) Et cette formule est suivie d'un exemple que j'ai étendu un peu, en utilisant ce tableau: Les enregistrements du produit A Correspond à l'exemple dans le lien. J'ai composé les nombres à partir du produit B. Voici la requête de clause de modèle qui implémente la formule. Notez comment la formule traduire directement dans la seule règle de la clause de modèle. La constante de lissage K est définie À .5, sur la base d'une fenêtre de valeurs (n) égale à 3. Défi: essayez ceci sans la clause modèle et voyez si vous pouvez trouver quelque chose de plus complet 5 commentaires: 11.2 fonctionnalités en usage avec dat as (select 39A39 product Date 392009-01-0139 mois, 10 montant de double union tous sélectionner 39A39, date 392009-02-0139, 15 de dual union tous sélectionner 39A39, date 392009-03-0139, 17 de dual union tous sélectionner 39A39, date 392009 -04-0139, 20 de double union tous sélectionnés 39A39, date 392009-05-0139, 22 de double union tous sélectionnés 39A39, date 392009-06-0139, 20 de double union tous sélectionnés 39A39, date 392009-07-0139, 25 de dual union tous sélectionnés 39A39, date 392009-08-0139, 27 de dual union tous sélectionnés 39A39, date 392009-09-0139, 30 de dual union tous sélectionnés 39A39, date 392009-10-0139, 35 de dual union tous Sélectionnez 39A39, date 392009-11-0139, 37 de double union tous sélectionnés 39A39, date 392009-12-0139, 40 de double union tous sélectionnés 39B39, date 392009-01-0139, 0 de double union tous sélectionnés 39B39, date 392009 -02-0139, 50 de double union tous sélectionnés 39B39, date 392009-03-0139, 10 de double union tous sélectionnés 39B39, date 392009-04-0139, 40 de double union tous sélectionnés 39B39, date 392009-05-0139, 15 de dual union tous sélectionnés 39B39, date 392009-06-0139, 35 de dual union tous sélectionnés 39B39, date 392009-07-0139, 30 de dual union tous sélectionnés 39B39, date 392009-08-0139, 30 de dual union tous Sélectionnez 39B39, date 392009-09-0139, 20 de dual union tous sélectionnés 39B39, date 392009-10-0139, 20 de double union tous sélectionnés 39B39, date 392009-11-0139, 20 de double union tous sélectionnés 39B39, date 392009 -12-0139, 20 de dual), rns as (select dat. . Rownumber () over (partition par ordre de produit par mois) rn -. 2 (1count () sur (partition par produit)) k. (Produit, mois, montant, rn, x) comme (sélectionner r. produit, r. month, r. amount, r. rn, r. amount x de rns r où rn 1 union all select Ns. product, ns. month, ns. amount, ns. rn, ns. k (ns. amount - es. x) es. xx de rns ns, res es où ns. rn es. rn 1 et ns. product es (X, 3) EMA de res commande par produit, mois après le calcul de la forme fermée Je suis venu avec le code suivant qui, si plus comme une obscurcissement que rien d'exhaustif. L'idée est de créer des multiples en cours d'exécution en utilisant une concaténation de chaîne et la fonction xml-eval. Les formes fermées des cas spéciaux ne nécessitent que des sommes courantes. Il y a un cas général et deux cas spéciaux qui sont beaucoup plus faciles: avec t1 comme (sélectionner le produit, le mois, le montant, le montant ci, le nombre de rownumber () sur (partition par ordre de produit par mois) rn, --2 (1 rownumber (Par ordre de produit par mois)) ki 0,5 ki des ventes), t2 comme (choisissez le produit, le mois, le montant, (cas où rn 1 puis 1 autre ki fin ci) ai, cas où rn 1 puis 1 autre Ki) fin bi à partir de t1), t3 comme (produit SELECT, MOIS, quantité, ai, xmlquery), 39,39, 3939 (REMPLACER (wmconcat (bi) ) RETOUR au contenu).getnumberval () mi FROM t2), t4 comme (sélectionner le produit, le mois, le montant, mi, (mi) xi de t3) SELECT product, MONTH, amount, round Par produit COMMANDE PAR MOIS lignes entre ENTRÉE non précisée et COURANTE ACTUELLE), 3) ema FROM t4 Cas spécial K 0.5: avec t1 comme (sélectionner le produit, le mois, le montant, le numéro rownumber () sur (partition par ordre de produit par mois) rn, 1, 0), 1)) ci de la vente) choisir le produit, le mois, le montant, le tour (somme (ci) sur (partition par (2, rn), 3) ema de t1 Cas particulier K 2 (1 i): avec t1 comme (sélectionner le produit, le mois, le montant, le numéro de rownumber () sur (partition Par ordre de produit par mois) rn, nombre rownumber () sur (partition par ordre de produit par mois) ci de la vente) select product, month, amount, round Et la ligne courante) 2 (rn (rn 1)), 3) ema de t1 I39ll afficher la preuve de la forme fermée si quelqu'un est intéressé à elle. C'est un excellent exemple de quotfun avec SQLquot :-) Une combinaison de XMLQuery, le wmconcat non documenté, et des fonctions analytiques avec la clause windowing. J'aime ça. Bien qu'il ne soit pas aussi complet que la variante de la clause modèle et le Rafu39s récursif avec un, comme vous l'avez dit vous-même. Et bien sûr, j'aimerais voir la preuve de la forme fermée. J'ai abordé une autre question: comment optimiser la constante de lissage SELECT k - lissage constant. Mse - erreur quadratique moyenne FROM (SÉLECTIONNER À partir des ventes MODÈLE DIMENSION BY (produit ROWNUMBER () PARTIE (PARTITION PAR produit ORDRE PAR mois ASC) rn) MESURES (montant - montant des ventes. AS - erreur de carré - - ligne de travail et attributs - a) ligne de travail est le produit 39X39, rn 1 - b) les attributs de travail sont les suivants:. 0 AS SSE - somme SE pour tous les mois de produits. 0 AS MSE - moyenne SSE pour tous les mois de produits. 0 AS k - pour tous les produits mois. 0 AS PreMSE - avant MS39 k39s pour tous les mois produits. 0 AS diff - entre MSE actuel et antérieur. 0.1 AS delta - incrément initial. 0 AS priorpt - point de départ initial -) RÈGLES ITERATE (99) JUSQU'À (abs (diff39A39,1) lt 0,00010) (Cany, rn montantcv (), cv () K39A39,1 priorpt39A39,1 delta39A39,1. , Rn ORDRE BY produit, rn ASC COALESCE (K39A39,1 Ccv (), cv () (1-K39A39,1) Xcv (), cv () - 1, Ccv (), cv ()) Pproduct, rn Xcv (), Cv () - 1. SEproduct, rn PUISSANCE (Ccv (), cv () - Xcv (), cv () - 1, 2) SSE39A39,1 SUM (SE) any, any MSE39A39,1 SUM (SE) any, any 24. diff39A39,1 CASE itérationnumber WHEN 0 alors NULL ELSE preMSE39A39,1 - MSE39A39,1 END. PreMSE39A39,1 MSE39A39,1 delta39A39,1 CASE WHEN diff39A39,1 lt 0 THEN - abs (delta39A39, 12) ELSE abs (delta39A39,1) ENDT39A39,1 K39A39,1)) où le produit 39A39 et rn 1 K MSE ---------- ---------- .599999237 174.016094 Comment calculer une moyenne mobile SQL sans une mise à jour de curseur: si vous travaillez avec les versions les plus récentes de SQL Server, vous pouvez utiliser les fonctions de fenêtrage pour accomplir la même chose. J'ai posté le code mis à jour à la fin du message. Pour cette vidéo, j'aime toujours le processus de pensée d'ancrage à une date. Vidéo: Moyenne mobile de 3 jours en SQL Un moyen efficace de calculer une moyenne mobile en SQL en utilisant quelques astuces pour définir des ancres de date. Il ya des débats sur la meilleure façon de faire une moyenne mobile SQL dans SQL Server. Certaines personnes pensent qu'il ya des moments où un curseur est le plus efficace. D'autres pensent que vous pouvez tout faire d'une manière set-based sans le curseur. L'autre jour, j'allais calculer une moyenne mobile et ma première pensée était d'utiliser un curseur. J'ai fait quelques recherches rapides et trouvé cette question forum: Moyenne mobile dans TSQL Il ya un post qui montre une sous-requête avec une date d'ancrage pour aider à trouver le décalage de 1 et 2 jours. Voici le script que vous pouvez utiliser pour tester le résultat final SQL Moving Average de 3 jours. Voici la requête finale. Voici la requête que vous utiliserez avec SQL Server 2012.
No comments:
Post a Comment