IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Calculer une Moyenne Mobile


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Equateur

    Informations forums :
    Inscription : Octobre 2011
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Calculer une Moyenne Mobile
    Bonjour a tous,

    Je dispose d'une table avec par exemple une colonne "Nombre" qui contient 1000 enregistrements.

    Je veux avoir une requette ou une nouvelle table qui contient une nouvelle colonne "MoyenneMobile" et bien entendu ma colonne "Nombre".

    Dans cette colonne "MoyenneMobile" je cherche a calculer la moyenne (mobile) par exemple des 20 enregistrements precedents.
    C'est a dire que par exemple, sur la ligne 20 de ma table, je vais veux voir apparaitre le resultat du calcul suivant : (ValeurLigne 1 + ValeurLigne 2 + ...+ValeurLigne 20)/20
    Sur la ligne 21 de ma table, je vais veux voir apparaitre le resultat du calcul suivant : (ValeurLigne 2 + ValeurLigne 3 + ...+ValeurLigne 21)/20
    Et ainsi de suite.

    Bien entendu, je cherche a rendre parametrable cela, c'est a dire que je compte pouvoir facilement changer la taille de ma Moyenne mobile, c'est a dire par exemple realiser une moyenne mobile sur les 10, 20 et pourquoi 100 derniers enregistrements.

    Je suis un peu perdu pour savoir comment realiser cela. Je ne sais pas si il y a des solutions grace aux requetes, ou s'il faut se tourner vers du VBA...?

    Je suis en train de découvrir l'acces aux données avec DAO et Recordset et je ne sais pas si c'est une solution.

    Pour info, ma table risque d'avoir entre 100.000 et 1.000.000 lignes.

    Je vous remercie par avance pour votre aide.

    Amicalement,

    Kostia

  2. #2
    Membre actif
    Homme Profil pro
    Chercheur
    Inscrit en
    Juin 2011
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2011
    Messages : 162
    Points : 248
    Points
    248
    Par défaut
    Bonjour,

    Utilisez la fonction DAvg (MoyDom) qui est paramétrable à volonté. Attention cependant à avoir un champ type Numauto qui vous permette d'avoir un ordre fixe de vos enregistrements et de les sélectionner par le critère de recherche.

    BCdt

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Equateur

    Informations forums :
    Inscription : Octobre 2011
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Comment utiliser cette fonction?
    Citation Envoyé par fbtsra Voir le message
    Bonjour,

    Utilisez la fonction DAvg (MoyDom) qui est paramétrable à volonté. Attention cependant à avoir un champ type Numauto qui vous permette d'avoir un ordre fixe de vos enregistrements et de les sélectionner par le critère de recherche.

    BCdt
    Merci pour votre aide. Cependant je reste toujours un peu bloqué. Non pas sur l'utilité de cette fonction mais comment l'utiliser pour lui dire de ne prendre en compte que les X derniers enregistrements?
    Par exemple, si je veux realiser une moyenne mobile sur les 10 derniers enregistrements. Comment dire a la fonction DAvg de ne prendre en compte que les champs qui sont compris entre le numero de cle actuel et le numero de cle actuel - 10 ?

    Je vous remercie pour votre aide

    Kostia

  4. #4
    Membre actif
    Homme Profil pro
    Chercheur
    Inscrit en
    Juin 2011
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2011
    Messages : 162
    Points : 248
    Points
    248
    Par défaut
    Bonjour,

    En utilisant la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MoyDom("x";"y";"[clé]>[clé actuel]-10 AND [clé]<=[clé actuel]")
    Je ne peux pas vous aider plus sur la syntaxe sans connaitre vos tables/champs , ni savoir ou et comment vous voulez faire ce calcul ...

    Bcdt

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Equateur

    Informations forums :
    Inscription : Octobre 2011
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Bonjour Fbtsra,
    Merci pour votre aide. Pour vous donner un peu plus de precisions, voici ma requete "RqMoy" qui n'affiche que deux colonnes de ma table:

    Clé primaire : [ID]
    Valeur : [Valeur]

    J'ai 100.000 lignes

    Je compte créer una colonne "MoyenneMobile" qui réaliser la moyenne mobile des X precentes valeurs de "Valeur".

    Voici un exemple :
    Le resultat de ma requette "RqMoy"

    ID Valeur
    1 1.5
    2 1.6
    3 1.8
    4 2
    5 1.9
    6 1.7
    8 1.6
    9 1.5
    ...
    100000 2.1

    Si par exemple je compte avoir le resultat d'une moyenne mobile de 3, c'est a dire qui realise la moyenne des 3 derniers enregistrements, je voudrais obtenir le resultat de la requette suviante :

    ID Valeur MoyenneMobile
    1 1.5 -
    2 1.6 -
    3 1.8 1.6333
    4 2 1.8
    5 1.9 1.9
    6 1.7 1.8666
    8 1.6 1.7333
    9 1.5 1.6
    ...
    100000 2.1 2.3

    J'ai essayé d'utiliser la fonction DAvg mais je ne sais pas comme dire a cette fonction de ne prendre en compte que les 3 dereniers enregistrements.

    Voici par exemple l'une des formules que j'ai essayé mais qui ne marche pas :
    MoyenneMobile: DAvg("[Valeur]";"RqMoy";"[ID]>[ID]-3 AND [ID]<=[ID]")
    Si je ne mets aucun crtiere, la requette m'affiche immediatement la moyenne de tous les enregistrements.

    Si vous pouviez me donner un petit coup de main ce serait génial.

    Je vous remercie d'avannce.


    Kostia

  6. #6
    Membre actif
    Homme Profil pro
    Chercheur
    Inscrit en
    Juin 2011
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2011
    Messages : 162
    Points : 248
    Points
    248
    Par défaut
    Bonjour,

    Voici la requête répondant à vos attentes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT RqMoy.ID, RqMoy.Valeur, DAvg("[Valeur]","RqMoy","[ID]>" & [ID]-[Moyenne sur :] & " AND [ID]<=" & [ID] & "") AS MoyenneMobile, *
    FROM RqMoy
    WHERE (((RqMoy.ID)>[Moyenne sur :]-1));
    elle va vous demander [Moyenne sur :] qui correspond à 3 dans votre exemple.

    Bcdt

  7. #7
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 591
    Points
    3 591
    Billets dans le blog
    8
    Par défaut
    Salut
    Puisqu'il peut y avoir des trous dans les ID, je te propose...
    code à mettre dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Function lamoyennemobile(id As Long, tranche As Integer)
    Dim rs As DAO.Recordset
    Dim str As String
    str = "SELECT Avg(rq.lanote) AS moyenne FROM (SELECT TOP " & tranche & "  Feuil1.noteclasse AS lanote FROM Feuil1 WHERE (((Feuil1.numeroligne)<=" & id & ")) ORDER BY Feuil1.numeroligne DESC) AS rq;"
    Set rs = CurrentDb.OpenRecordset(str)
    If Not (rs.EOF And rs.BOF) Then
    lamoyennemobile = rs(0)
    Else
    lamoyennemobile = 0
    End If
    End Function
    code de la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Feuil1.numeroligne, Feuil1.noteclasse, lamoyennemobile([numeroligne],5) AS moyennne
    FROM Feuil1;
    "Feuil1" est à remplacer par le nom de ta table. Tu peux automatiser en remplaçant la tranche (ici le 5) par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms![le nom du formulaire qui lance la requête]![le nom de la zone de texte qui contient la tranche]
    @+

Discussions similaires

  1. [AC-2013] Requete pour calculer une Moyenne mobile exponentielle (qui depend du recordset precedent.)
    Par lukebalthazar dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 28/06/2014, 00h31
  2. Réponses: 2
    Dernier message: 16/02/2011, 14h59
  3. [CR XI] Calculer une moyenne mobile
    Par Cereal123 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 08/09/2010, 17h17
  4. Calcul d'une moyenne mobile
    Par guillaume117 dans le forum LabVIEW
    Réponses: 0
    Dernier message: 08/06/2010, 12h01
  5. calculer une moyenne avec une requete externe
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 16h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo