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

Langage SQL Discussion :

Lisser des valeurs sur 1min en fonction du timestamp


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    automaticien
    Inscrit en
    Février 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Lisser des valeurs sur 1min en fonction du timestamp
    Bonjour à tous,

    dans le cadre d'un projet en interne dans ma société, je souhaite récupérer des valeurs enregistrées dans une base SQL et pouvoir les afficher lissé sur une minute dans un intervalle de temps défini par un exploitant.

    Je m'explique, j'enregistre des valeurs de capteurs dans ma BDD, par exemple un débitmètre. Les enregistrements sont rapide. Voici un exemple:

    Nom : BDD.PNG
Affichages : 501
Taille : 36,5 Ko

    Explication des colonnes:
    - TS=timeStamp
    - Name= le nom du capteur
    - Value= la valeur du capteur


    Alors les enregistrements aussi rapide sont utile dans mon cas d'un point de vu process (donc pas question de modifier le temps d'échantillonage) , mais dans le cadre d'une exploitation de données celà ne me conviens pas. J'aimerais exploiter et afficher les valeurs de façon suivante:
    - Afficher les valeurs toutes les minutes
    - Les valeurs de chaque minute correspondent à la moyenne sur la minute
    - L'utilisateur doit pouvoir choisir une plage d'exploitation (sur un jour, un poste, une semaine etc etc)

    Pour celà, en requête SQL, la fonction "AVG" me semble pertinente mais comment dire en SQL:
    - Fais moi la moyenne des valeurs "nom du capteur" sur la plage "début temps" à "fin temps" en prenant en compte que les valeurs moyennée sur la minute?

    J'avais pensé à faire une requête du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT "TS", AVG(Value) FROM "table_capteur"
    GROUPE BY MINUTE (TS)
    Sauf que cela ne fonctionne pas... Il faut dire que les BDD, je n'ai pas touché depuis plus de 10a, et j'aimerais beaucoup me replonger dedans, mais actuellement je sèche un peu, même si je pense que la solution est simple.

    Je vous remercie

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 387
    Points
    28 387
    Par défaut
    Pou répondre complètement, il faudrait connaître le SGBD que tu utilises...
    Mais ton principe de départ est presque le bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  name
        ,   arrondi_à_la_minute(ts)
        ,   AVG(value) 
    FROM    table_capteur
    WHERE   ts  BETWEEN :debut  AND :fin
    GROUP BY name
        ,   arrondi_à_la_minute(ts)
    ORDER BY name
        ,   arrondi_à_la_minute(ts)
    La fonction arrondi_à_la_minute dépendant entièrement de ton SGBD...

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    automaticien
    Inscrit en
    Février 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse.

    J'utilise microsft SQL, par contre faut il convertir le timestamp en format date ou est ce que je peux utiliser la requête tel quelle?

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 311
    Points : 39 675
    Points
    39 675
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Vous n'étiez pas loin du compte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select NAME
         , SUBSTR(CHAR(TS), 01, 16)
         , AVG(VALUE)
    from MA_TABLE
    GROUP BY NAME
           , SUBSTR(CHAR(TS), 01, 16)
    A noter que vos colonnes portent des noms réservés, il faut donc ajouter des quotes si ce sont les vrais noms.
    Le mieux est d'utiliser des noms d'objets (tables, vues, colonnes etc...) hors noms réservés

    EDIT : je n'avais pas vu la réponse d'AL1_24. Ma proposition doit fonctionner en l'état, ajoutez un tri et un filtrage si besoin

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    automaticien
    Inscrit en
    Février 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponses. Pour le moment je n'ai pas eu le temps de faire trop de test, mais en prenant brut le code ca ne fonctionne pas. A mon avis je n'ai besoin que de quelques ajustements, je me pencherais dessus quand j'aurais le temps. Pour exemple, la commande "SUBSTR" dans mon cas est "SUBSTRING"... Rien de bien méchant, si je coince quand j'arriverais a me degager du temps je vous ferais signe.

    En tout cas, encore merci, j'ai déjà des pistes à explorer

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Très personnellement, je trouve l'idée de passer par une expression littérale de l'heure pour faire l'arrondi est une TRES mauvaise idée :
    - Si la culture du programme change
    - Si une information de fuseau horaire est présente dans l'heure

    => Alors votre requête va faire n'importe quoi !

    Passer par des fonctions manipulant le type datetime ou timestamp pour faire votre arrondi, c'est bien plus sûr (et accessoirement, ça devrait être plus performant).

    Avec SQL Server, on utilisera par exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dateadd(SECOND, -datepart(SECOND, lacolonnequicontientlheure), dateadd(MILLISECOND, -datepart(MILLISECOND, lacolonnequicontientlheure), lacolonnequicontientlheure))

Discussions similaires

  1. cocher une case en fonction des valeurs sur plusieurs plages
    Par flyfranky dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 15/11/2007, 10h20
  2. Insérer des valeurs sur un True DBGrid
    Par lilas_violet dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 05/03/2007, 22h51
  3. Réponses: 3
    Dernier message: 05/03/2007, 12h54
  4. Réponses: 2
    Dernier message: 17/05/2006, 11h43
  5. [StringGrid] Aligner des valeurs sur le '.' ?
    Par MiJack dans le forum Langage
    Réponses: 3
    Dernier message: 06/02/2006, 16h55

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