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 MySQL Discussion :

Problème de requête sur plage de données pour faire une rose des vents


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    passionné
    Inscrit en
    Septembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : passionné

    Informations forums :
    Inscription : Septembre 2015
    Messages : 4
    Points : 15
    Points
    15
    Par défaut Problème de requête sur plage de données pour faire une rose des vents
    Chalut!

    Bon déjà je débute en sql (et j'utilise mySQL au fait) donc je pense que peut être je m'attaque à un problème velu mais bon... Explications! :

    je voudrais créer une rose des vents grâce à un framework js qui s'appelle highchart.
    une rose des vents est divisée en 16 parties, les points cardinaux qui indiquent la direction du vent.
    la station météo me génère une table avec des relevés de données fais toutes les 5 minutes.
    Les données de ma BDD qui m'intéressent ici sont : direction du vent et vitesse du vent.
    le truc c'est que pour la direction la colonne renvoie des valeurs allant de 0 à 360 que je dois regrouper par tranches.
    si par exemple j'ai un relevé qui indique une direction de 350, je voudrait que cela soit classé dans la plage de valeur qui indique le Nord, si j'ai un relevé à 50 il faut que cela corresponde à Nord-Est... Enfin j'imagine que vous avez capté.

    la question est comment faire ce découpage par plages de valeurs sans enchainer des requêtes dans mon code php... ça me parait sale et assez bourrin.
    MySQL est il capable de faire ce calcul et est il plus performant de le faire faire directement par lui plutôt qu'avec php ou même js côté client?

    Merci d'avance pour vos chouettes réponses!

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    C'est un peu bourrin (surtout avec 16 plages) mais vous pouvez utiliser un case when avec des between pour définir les plages

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Un calcul simple suffit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ROUND((ANGLE - 11.5) / 16, 0)
    Vous donnera le cap en 16 éléments numérotés de 0 à 15.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Ca ne fonctionne pas, voici ce que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ROUND((001   - 11.5) / 16, 0)
    => -1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ROUND((180   - 11.5) / 16, 0)
    => +11

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ROUND((359   - 11.5) / 16, 0)
    => +22

    Pour des plages de 1 à 16

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour

    essayez comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CEIL(MOD(angle + 360/16/2 , 360) * 16/360)

  6. #6
    Membre à l'essai
    Homme Profil pro
    passionné
    Inscrit en
    Septembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : passionné

    Informations forums :
    Inscription : Septembre 2015
    Messages : 4
    Points : 15
    Points
    15
    Par défaut
    Re et merci de vos nombreuses réponses!
    Bon, j'ai tourné pas mal le problème et je me suis orienté vers la solution côté php.
    avec des boucles imbriquées, la premiere parcours les lignes de ma table et la deuxième avec un for initialisé à 1 qui s'arrête à 16.
    grâce à cette seconde boucle je vérifie si ma valeur est comprise entre un min et un max et si c'est le cas je donne à ladite valeur la valeur correspondante à un de mes point cardinal.
    D'ailleurs en y pensant je fais ça avec des if else, et je me dis que je devrais ptet faire avec des switch..
    le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    foreach($data as $row) 
        {
            $windSpeed *= 1.8502;
            $xVentRose['windDir'][] = $row[1];
            $xVentRose['windSpeed'][] = $row[2];
        }
     
        $limitB = 11.25;
        $limitH = 33.75;
        $j = 0;
        foreach ($xVentRose['windDir'] as &$value) {
             ($value < 11.25 || $value > 348.75){
     
                  $value = 0;
     
                }
     
            for ($i=1; $i <= 16 ; $i++) {  
                if(($value <= ($i * ($limitB + $limitH)/2) - $limitB) || ($value >= ($i * ($limitB + $limitH)/2) + $limitB))
                {
     
                  $value = $value;
     
                }else{
     
                  $value = $i * ($limitB + $limitH)/2;
     
                }
     
            }
     
            $xVentRose2[] = [$value, $xVentRose['windSpeed'][$j]];
              $j++;
        }
    je vais quand même essayer la solution avec le CEIL en SQL... pour voir ce que ça dit.
    De toute façon c'est pas terminé parce que maintenant faut que je m'attaque à faire des pourcentages... En effet tous les points cardinaux ça fait 100% sur les abscisses et la fréquence des différents vitesses du vent en ordonnées doivent aussi être traités en %. Je sais pas si c'est très clair...
    Voilà la belle rose des vents que je veux faire en fait : http://www.highcharts.com/demo/polar-wind-rose

    Si le sujet vous intéresse, c'est chouette parce que toutes vos idées sont les bienvenues!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/04/2015, 10h06
  2. [XL-2013] Utilisation d'un tableau pour faire une pyramide des ages
    Par bdathis dans le forum Excel
    Réponses: 2
    Dernier message: 16/09/2014, 09h44
  3. [XL-2003] faire une sélection dans une plage de données pour renseigner une liste de choix
    Par tremens dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/03/2010, 18h12
  4. [Lazarus] Problème de requête sur une base de données
    Par bubulemaster dans le forum Lazarus
    Réponses: 1
    Dernier message: 09/11/2007, 18h14
  5. Problème de requêtes sur deux tables
    Par Pymm dans le forum Access
    Réponses: 6
    Dernier message: 06/09/2005, 09h06

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