L'utilisation d'une moyenne mobile simple pour lisser les données est une technique assez populaire. Son trop mauvais l'exemple principal dans l'aide de SQL Anywhere est loin d'être simple: Ce qui rend cet exemple si complexe Outre l'énoncé du problème, qui est: calculer la moyenne mobile de toutes les ventes de produits, par mois, en l'an 2000. Heres ce qui rend Il complexe: deux références à la fonction AVG (), un GROUP BY (qui, à lui seul, fait à peu près n'importe quel SELECT un head-scratcher),. Une clause WINDOW furtive une clause WINDOW qui n'utilise même pas le mot clé WINDOW. Donc pour les non initiés (les gens qui ont besoin d'exemples plus que quiconque), il n'est pas évident qu'une fenêtre est impliqué à tous. Pas n'importe quelle clause de WINDOW, mais vous pouvez inclure tous les composants que vous pouvez coder dans une WINDOW: a PARTITION BY, une clause RANGE. Pas une simple clause ROWS, mais la clause RANGE plein, qui a une relation intime avec la ORDER BY. Je sais ce qu'est une ligne, mais ce que la redacted est une GAMME Mais attendez, theres plus: Le choix de RANGE sur ROWS dans cet exemple est critique pour le bon fonctionnement de la requête. (Pour une description plus complète de cet exemple particulier, voir l'exemple 23 - Calculer une moyenne mobile dans Glenn Paulleys, excellent livre blanc OLAP). Maintenant, revenons sur la bonne voie: une moyenne mobile vraiment simple L'exemple suivant affiche une valeur de 10 jours Les données ainsi que la moyenne mobile de la valeur d'aujourd'hui et hier: La clause WINDOW aux lignes 21 à 23 définit une fenêtre mobile qui contient deux lignes: rangée d'aujourd'hui (ROUTE COURANTE) et rangée hier (1 PRÉCÉDENT): la clause WINDOW ORDER BY détermine ce qui PRECEDING signifie (la ligne précédente par t. entrydate) et la clause ROWS détermine la taille de la fenêtre (toujours deux lignes). L'expression AVG (t. value) OVER twodays sur la ligne 19 fait référence à la clause WINDOW par nom et indique à SQL Anywhere de calculer la moyenne des deux valeurs de t. value qui existent dans la fenêtre glissante à 2 lignes, pour chaque Ligne dans le jeu de résultats. Donc, pour 2012-02-02 la moyenne de 10 et 20 est 15.000000, pour 2012-02-03 la moyenne de 20 et 10 est 15.000000, pour 2012-02-04 la moyenne de 10 et 30 est de 20.000000, pour 2012- 02-10 la moyenne de 10 et 60 est de 35.000000. Oups, que diriez-vous de la première rangée La ligne 2012-02-01 n'a pas une rangée PRÉCÉDENTE, alors quelle est la moyenne sur la fenêtre mobile Selon Glenn Paulleys livre blanc dans le cas d'une fenêtre en mouvement, il est supposé que les lignes contenant Null Les valeurs existent avant la première ligne, et après la dernière ligne, dans l'entrée. Cela signifie que lorsque la fenêtre de déplacement a 2012-02-01 comme ROUGE COURANT, la ligne 1 PRÉCÉDENT contient des valeurs NULL. Et quand SQL Anywhere calcule un AVG () qui inclut une valeur NULL, il ne compte pas le NULL du tout. Pas dans le numérateur ou dans le dénominateur lors du calcul de la moyenne. Heres preuve: C'est pourquoi twodayaverage 10.000000 pour la première ligne 2012-02-01. Publié par Breck Carter à 15:47 C'est une question Evergreen Joe Celko. J'ignore quelle plate-forme DBMS est utilisée. Mais dans tous les cas Joe a réussi à répondre il ya plus de 10 ans avec SQL standard. Joe Celko SQL Puzzles et Réponses citation: Cette dernière tentative de mise à jour suggère que nous pourrions utiliser le prédicat pour construire une requête qui nous donnerait une moyenne mobile: La colonne supplémentaire ou l'approche de requête mieux La requête est techniquement mieux parce que l'approche UPDATE sera Dénormaliser la base de données. Toutefois, si les données historiques enregistrées ne vont pas changer et que le calcul de la moyenne mobile est coûteux, vous pouvez envisager d'utiliser l'approche par colonne. SQL requête Puzzle: par tous les moyens uniformes. Vous venez de jeter au godet de poids approprié en fonction de la distance du point de temps actuel. Par exemple quottake weight1 pour datapoints dans 24 heures à partir du point de données actuel weight0.5 pour datapoints dans 48hrsquot. Dans ce cas, il importe combien de points de données consécutifs (comme 6:12 am et 11:48 pm) sont distants les uns des autres Un cas d'utilisation, je peux penser serait une tentative de lisser l'histogramme partout où datapoints ne sont pas denses assez ndash msciwoj May 27 15 at 22:22 Je ne suis pas sûr que votre résultat attendu (sortie) montre classique simple déplacer (rolling) moyenne pour 3 jours. Parce que, par exemple, le premier triple de nombres par définition donne: mais vous attendez 4.360 et sa confusion. Néanmoins, je suggère la solution suivante, qui utilise la fonction de fenêtre AVG. Cette approche est beaucoup plus efficace (claire et moins intensive en ressources) que SELF-JOIN introduit dans d'autres réponses (et Im surpris que personne n'a donné une meilleure solution). Vous voyez que AVG est enveloppé avec le cas lorsque rownum gt p. days puis à forcer NULL s dans les premières lignes, où 3 jours Moyenne mobile est vide de sens. Répondre fév 23 16 at 13:12 Nous pouvons appliquer Joe Celkos dirty left jointure méthode (comme cité plus haut par Diego Scaravaggi) pour répondre à la question telle qu'elle a été posée. Génère la sortie demandée: Réponse Jan 9 16 à 0:33 Votre réponse 2017 Stack Exchange, Inc Je travaille avec SQL Server 2008 R2, en essayant de calculer une moyenne mobile. Pour chaque enregistrement à mon avis, je voudrais collecter les valeurs des 250 enregistrements précédents, puis calculer la moyenne pour cette sélection. Mes colonnes de vue sont comme suit: TransactionID est unique. Pour chaque TransactionID. Je voudrais calculer la moyenne pour la valeur de la colonne, au cours des 250 derniers enregistrements. Donc, pour TransactionID 300, collecter toutes les valeurs des 250 lignes précédentes (affichage est trié en descendant par TransactionID) et puis dans la colonne MovAvg écrire le résultat de la moyenne de ces valeurs. Je cherche à recueillir des données dans une gamme d'enregistrements. A demandé Oct 28 14 at 20:58
No comments:
Post a Comment