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 fait par lui-même à 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épondu Jan 9 16 à 0:33 Votre réponse 2017 Stack Exchange, IncAVG (Transact-SQL) TOUT Applique la fonction d'agrégation à toutes les valeurs. ALL est la valeur par défaut. DISTINCT Spécifie que AVG doit être exécuté uniquement sur chaque instance unique d'une valeur, quel que soit le nombre de fois où la valeur se produit. Expression Est une expression de la catégorie de type de données numérique exacte ou approximative, à l'exception du type de données bit. Les fonctions agrégées et les sous-requêtes ne sont pas autorisées. OVER (partitionbyclause orderbyclause) partitionbyclause divise le jeu de résultats produit par la clause FROM dans les partitions auxquelles la fonction est appliquée. Si elle n'est pas spécifiée, la fonction traite toutes les lignes du jeu de résultats de la requête comme un seul groupe. Orderbyclause détermine l'ordre logique dans lequel l'opération est effectuée. Ordre parclause est nécessaire. Pour plus d'informations, consultez Clause OVER (Transact-SQL). Le type de retour est déterminé par le type du résultat d'expression évalué. Catégorie décimale (p, s) Si le type de données d'expression est un type de données d'alias, le type de retour est également du type de données d'alias. Toutefois, si le type de données de base du type de données alias est promu, par exemple de tinyint à int. La valeur de retour est du type de données promu et non du type de données d'alias. AVG () calcule la moyenne d'un ensemble de valeurs en divisant la somme de ces valeurs par le nombre de valeurs nulles. Si la somme dépasse la valeur maximale pour le type de données de la valeur de retour, une erreur est retournée. AVG est une fonction déterministe lorsqu'elle est utilisée sans les clauses OVER et ORDER BY. Elle est non déterministe lorsqu'elle est spécifiée avec les clauses OVER et ORDER BY. Pour plus d'informations, voir Fonctions déterministes et non déterministes. A. Utilisation des fonctions SUM et AVG pour les calculs L'exemple suivant calcule les heures de vacances moyennes et la somme des heures de congé de maladie que les vice-présidents des cycles de travail Adventure ont utilisé. Chacune de ces fonctions agrégées produit une seule valeur récapitulative pour toutes les lignes récupérées. L'exemple utilise la base de données AdventureWorks2012.
No comments:
Post a Comment