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. Demandée Oct 28 14 at 20: 58Moving moyenne dans T-SQL Un calcul commun dans l'analyse des tendances est la moyenne mobile (ou roulant). Une moyenne mobile est la moyenne des, par exemple, les 10 dernières rangées. La moyenne mobile montre une courbe plus lisse que les valeurs réelles, plus avec une période plus longue pour la moyenne mobile, ce qui en fait un bon outil pour l'analyse des tendances. Ce blog affichera comment calculer la moyenne mobile dans T-SQL. Différentes méthodes seront utilisées en fonction de la version de SQL Server. Le graphique ci-dessous montre l'effet de lissage (ligne rouge) avec une moyenne mobile de 200 jours. Les cours boursiers sont la ligne bleue. La tendance à long terme est clairement visible. T-SQL Déplacement Avergage 200 jours La démonstration ci-dessous nécessite la base de données TAdb qui peut être créée avec le script situé ici. Dans l'exemple à venir, nous calculons une moyenne mobile pour les 20 derniers jours. Selon la version de SQL Server, il y aura une méthode différente pour effectuer le calcul. Et, comme nous le verrons plus loin, les nouvelles versions de SQL Server ont des fonctions permettant un calcul beaucoup plus efficace. SQL Server 2012 et versions ultérieures Moyenne mobile Cette version utilise une fonction de fenêtre agrégée. Quoi de neuf dans SQL 2012 est la possibilité de restreindre la taille de la fenêtre en spécifiant le nombre de lignes précédant la fenêtre doit contenir: lignes précédentes est 19, car nous allons inclure la ligne actuelle ainsi dans le calcul. Comme vous pouvez le voir, le calcul de la moyenne mobile dans SQL Server 2012 est assez simple. La figure ci-dessous illustre le principe de fenêtrage. La ligne courante est marquée en jaune. La fenêtre est marquée d'un fond bleu. La moyenne mobile est simplement la moyenne de QuoteClose dans les lignes bleues: T-SQL Fenêtre de moyenne mobile. Les résultats des calculs dans les anciennes versions de SQL Server sont identiques, de sorte qu'ils ne seront pas affichés à nouveau. SQL Server 2005 8211 2008R2 Moyenne mobile Cette version utilise une expression de table commune. Le CTE est auto-référencé pour obtenir les 20 dernières lignes pour chaque ligne: Moyenne mobile avant SQL Server 2005 La version antérieure à 2005 utilisera une jointure externe gauche à la même table pour obtenir les 20 dernières lignes. Comparaison des performances Si nous exécutons les trois méthodes différentes simultanément et vérifions le plan d'exécution résultant, il existe une différence spectaculaire de performance entre les méthodes: Comparaison de trois Différentes méthodes pour calculer la moyenne mobile Comme vous pouvez le constater, les améliorations apportées aux fonctionnalités de fenêtrage dans SQL 2012 font une énorme différence dans les performances. Comme mentionné au début de ce post, les moyennes mobiles sont utilisées comme un outil pour illustrer les tendances. Une approche commune consiste à combiner des moyennes mobiles de différentes longueurs, afin de repérer respectivement les variations des tendances à court, moyen et long terme. Un intérêt particulier est le franchissement des lignes de tendance. Par exemple, lorsque la courte tendance se déplace sur la tendance à long ou à moyen terme, cela peut être interprété comme un signal d'achat dans l'analyse technique. Et quand la tendance courte se déplace sous une ligne de tendance plus longue, cela peut être interprété comme un signal de vente. Le graphique ci-dessous présente les devis, Ma20, Ma50 et Ma200. T-SQL Ma20, Ma50, Ma200 acheter et vendre des signaux. Ce billet de blog fait partie d'une série sur l'analyse technique, TA, dans SQL Server. Voir les autres messages ici. J'ai essayé de créer une fonction qui calcule une moyenne mobile fenêtrée dans SQLServer 2008. Je suis tout à fait nouveau à SQL ainsi je suis ayant juste un peu de difficulté. Les données que j'essaie d'effectuer la moyenne mobile doivent être regroupées par jour (il s'agit de toutes les données horodatées), puis une fenêtre de moyenne mobile variable doit être appliquée à elle. J'ai déjà une fonction qui regroupe les données par jour (et id) qui est montré en bas. J'ai quelques questions: serait-il préférable d'appeler la fonction de regroupement dans la fonction de moyenne mobile ou devrais-je le faire tout à la fois Est-il possible d'obtenir la moyenne mobile pour les dates entrées dans la fonction, mais revenir n jours à Commencer la moyenne mobile de sorte que les n premiers jours des données retournées n'auront pas 0 pour leur moyenne (c.-à-d. S'ils veulent une moyenne mobile de 7 jours du 01-08-2011 au 02-08-2011 que je commence la moyenne mobile Calcul du 01-01-2011 afin que le premier jour qu'ils définissent a une valeur) Je suis en train de regarder comment faire la moyenne mobile, et savoir qu'une fenêtre mobile semble être la meilleure option (currentSum prevSum todayCount - NthDayAgoCount) nDays, mais je travaille encore à comprendre l'implémentation SQL de ce. J'ai une fonction de regroupement qui ressemble à ceci (certaines variables supprimées à des fins de visibilité): Qui renvoie un tableau comme tel: EDIT: Pour répondre à la première question que j'ai posée: J'ai fini par créer une fonction qui a déclaré un tableau temporaire et inséré les résultats À partir de la fonction de comptage en elle, puis utilisé l'exemple de user662852 pour calculer la moyenne mobile. Prenez la période de date cryptée hors de votre requête. Écrivez la sortie (comme votre échantillon à la fin) à une table temporaire (je l'ai appelée visites ci-dessous). Essayez cette auto jointure à la table temporaire: EDIT: Je n'ai pas assez de place dans les commentaires pour dire ceci en réponse à votre question: Ma jointure est un peu cartésienne parce qu'elle utilise un entre dans la contrainte de jointure. Chaque enregistrement dans la liste est en hausse contre tous les autres enregistrements, et puis je veux celles où la date que je rapport est entre une limite inférieure de (-7) jours et aujourd'hui. Chaque date de données est disponible pour la date de la liste, c'est la clé de votre question. Je pourrais avoir écrit la condition de jointure. Mais ce qui s'est réellement passé, c'est que je l'ai testé comme qui ne renvoie aucun enregistrement, car la syntaxe est entre LOW et HIGH. J'ai facepalmed sur 0 disques et échangé les arguments, thats all. Essayez ce qui suit, voyez ce que je veux dire: Il s'agit de la jointure cartésienne pour un seul listdate: Comparez ceci à la condition de jointure réelle Voir comment la date de la liste est entre datadate et dataplus6 dans tous les enregistrements
No comments:
Post a Comment