Partage
  • Partager sur Facebook
  • Partager sur Twitter

écart sur 3h d'enregistrement

Sujet résolu
    12 juin 2019 à 15:19:56

    Bonjour

    j'ai actuellement une BDD MySQL et une table avec un enregistrement qui se fait toutes les 5 minutes.

    sur le champ "bar" il y a la pression atmosphérique, sur le champ "recdateTZ" il y a l’année/mois/jour/heure sous ce format AAAAMMJJHHMM , il y a également un champ "timestamp".

    ma question : je souhaiterez obtenir l'écart qu'il y a eu entre  le mini et maxi de "bar"  sous une  période  (recdateTZ) de 3h.

    quelqu'un a t'il une idée ? 

    • Partager sur Facebook
    • Partager sur Twitter
      12 juin 2019 à 15:49:46

      Bonjour,

      SELECT
          MIN( bar ) AS mini,
          MAX( bar ) AS maxi
      FROM matable
      WHERE timestamp >= CURTIME()-INTERVAL 3 HOUR

      Cette requête te ressort le mini et le maxi de la colonne bar pour tous les enregistrements datant de moins de 3h ...

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        12 juin 2019 à 16:05:59

        Merci Benzouye

        je viens d’essayer la requête et elle me donne le mini et la maxi de la table entière.

        ce que je voudrais c'est qu'a chaque enregistrement (chaque ligne) j'ai l'écart qu'il y a entre le mini/maxi sous les trois dernières heure.

        le but est de récupérer la variation de pression sous 3 heures

        • Partager sur Facebook
        • Partager sur Twitter
          12 juin 2019 à 16:50:52

          lucasdom a écrit:

          elle me donne le mini et la maxi de la table entière

          Pas de la table entière, juste des enregistrements des 3 dernières heures.

          lucasdom a écrit:

          a chaque enregistrement (chaque ligne) j'ai l'écart qu'il y a entre le mini/maxi sous les trois dernières heure

          Ok, mais cela va être lourd ... Le principe est de faire une auto-jointure :

          SELECT
          	T1.recdateTZ,
          	T1.bar,
          	MIN( T2.bar ) AS mini,
          	MAX( T2.bar ) AS maxi
          FROM
          	matable T1
          		INNER JOIN matable T2
          			ON T1.timestamp >= T2.timestamp - INTERVAL 3 HOUR
          			AND T1.timestamp < T2.timestamp
          GROUP BY
          	T1.recdateTZ,
          	T1.bar
          ORDER BY T1.recdate

          On relie chaque enregistrements de la table à tous les enregistrements de la même table (d'où les alias T1 et T2 pour différencier) dont la date est inférieure de moins de 3 heures.

          Pour calculer l'écart je te laisse te débrouiller ;)

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            12 juin 2019 à 17:39:39

            merci de ton aide Benzouye

            je vais voir ce que je peux faire avec la deuxième requête, pour calculer l'écart ça doit le faire :)

            par contre je te re confirme que dans la première requête :

            SELECT MIN( bar ) AS mini, MAX( bar ) AS maxi FROM archivemeteo WHERE `tstamp` >= CURTIME()-INTERVAL 3 HOUR

            c'est le mini et maxi de la table : 

            976.1 hPa  le 9/11/2010 à 9h25 et 1043.5  hPa le 29/12/2014 à 23h30

            c'est dommage car elle répond a ce qu'il me faut :/ 

            • Partager sur Facebook
            • Partager sur Twitter
              12 juin 2019 à 18:00:15

              lucasdom a écrit:

              c'est le mini et maxi de la table 

              Ce n'est pas possible ... La clause WHERE filtre seulement sur les 3 dernières heures ...

              J'ai fait le test :

              CREATE TABLE `mesure` (
                `id` int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
                `tstamp` timestamp NULL,
                `bar` decimal(5,1) unsigned NULL
              ) ENGINE='InnoDB' COLLATE 'utf8_unicode_ci';
              
              INSERT INTO `mesure` (`id`, `tstamp`, `bar`) VALUES
              (1,	'2019-06-12 10:51:58',	1000.0),
              (2,	NOW(),			1001.0),
              (3,	NOW(),			1002.0),
              (4,	NOW(),			1003.0),
              (5,	NOW(),			1004.0),
              (6,	NOW(),			1005.0),
              (7,	'2019-06-12 10:52:02',	1006.0);

              Si je lance ma requête :

              SELECT MIN( bar ) AS mini, MAX( bar ) AS maxi
              FROM mesure
              WHERE tstamp >= CURTIME()-INTERVAL 3 HOUR;

              Elle me sort bien 1001 et 1005 (et pas 1000 et 1006) ... seules les 3 dernières heures sont prises en compte. Tu dois t'être trompé quelque part ...

              Après, 976.1 hPa et 1043.5 hPa sont peut-être les mini et maxi sur les 3 dernières heures mais aussi sur toute la table ...

              Sinon tu dis :

              lucasdom a écrit:

              c'est dommage car elle répond a ce qu'il me faut :/ 

              Ce qui est incohérent avec ta demande :

              lucasdom a écrit:

              a chaque enregistrement (chaque ligne) j'ai l'écart qu'il y a entre le mini/maxi sous les trois dernières heure

              Ce qui correspond à ma deuxième proposition avec l'auto-jointure ...

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                12 juin 2019 à 18:11:39

                je peux t'assurer que 

                Benzouye a écrit:

                lucasdom a écrit:

                c'est le mini et maxi de la table 

                Ce n'est pas possible ... La clause WHERE filtre seulement sur les 3 dernières heures ...

                J'ai fait le test :

                Si je lance ma requête :

                SELECT MIN( bar ) AS mini, MAX( bar ) AS maxi
                FROM mesure
                WHERE tstamp >= CURTIME()-INTERVAL 3 HOUR;

                Elle me sort bien 1001 et 1005 (et pas 1000 et 1006) ... seules les 3 dernières heures sont prises en compte. Tu dois t'être trompé quelque part ...

                Après, 976.1 hPa et 1043.5 hPa sont peut-être les mini et maxi sur les 3 dernières heures mais aussi sur toute la table ...

                je peux t'assurer pourtant que depuis mon dernier enregistrement le mini/maxi sur une periode de 3h est 1010 hPa et 1012.2 hPa


                je viens de créer la même table que toi et je vois que le format tstamp n'est pas du tout le même que le mien...

                la table que tu as crée

                ma table archivemeteo

                Benzouye a écrit:

                lucasdom a écrit:

                c'est le mini et maxi de la table 

                Ce n'est pas possible ... La clause WHERE filtre seulement sur les 3 dernières heures ...

                J'ai fait le test :

                CREATE TABLE `mesure` (
                  `id` int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
                  `tstamp` timestamp NULL,
                  `bar` decimal(5,1) unsigned NULL
                ) ENGINE='InnoDB' COLLATE 'utf8_unicode_ci';
                
                INSERT INTO `mesure` (`id`, `tstamp`, `bar`) VALUES
                (1,	'2019-06-12 10:51:58',	1000.0),
                (2,	NOW(),			1001.0),
                (3,	NOW(),			1002.0),
                (4,	NOW(),			1003.0),
                (5,	NOW(),			1004.0),
                (6,	NOW(),			1005.0),
                (7,	'2019-06-12 10:52:02',	1006.0);

                Si je lance ma requête :

                SELECT MIN( bar ) AS mini, MAX( bar ) AS maxi
                FROM mesure
                WHERE tstamp >= CURTIME()-INTERVAL 3 HOUR;

                Elle me sort bien 1001 et 1005 (et pas 1000 et 1006) ... seules les 3 dernières heures sont prises en compte. Tu dois t'être trompé quelque part ...

                cette requête sur la même table chez moi :

                -
                Edité par lucasdom 12 juin 2019 à 20:34:41

                • Partager sur Facebook
                • Partager sur Twitter
                  13 juin 2019 à 8:51:24

                  Erreur de ma part, ce n'est pas CURTIME() mais NOW() dans la clause WHERE... CURTIME ne renvoyant que l'heure, sans la date ...

                  SELECT MIN( bar ) AS mini, MAX( bar ) AS maxi
                  FROM mesure
                  WHERE tstamp >= NOW()-INTERVAL 3 HOUR;

                  :honte:

                  -
                  Edité par Benzouye 13 juin 2019 à 9:35:28

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    13 juin 2019 à 9:45:36

                    merci, ça fonctionne avec NOW() 

                    ça fonctionne très bien mais.... 

                    un problème dont je n'ai aucune idée sur la manière de le résoudre, pour obtenir l'écart il suffit de soustraire le mini du maxi, ça je sais faire et j'obtiens l'écart. Cependant si cet écart m'intéresse c'est parce que je souhaite voir si au fil des 3 heures  si l'écart est en plus ou en moins. exemple :

                    à 10h pression à 1000 hPa

                    à 13h pression à 1003 hPa

                    écart = + 3hPa en 3h

                    à 15h pression à 990 hPa

                    à 18h pression à 980 HPa

                    écart = - 10 hPa en 3h (avis de fort coup de vent) 

                    comment je peux savoir si l'écart est en positif ou négatif ? peut être en associant la valeur mini et maxi à l'heures du relevés ? 

                    -
                    Edité par lucasdom 13 juin 2019 à 10:46:34

                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 juin 2019 à 20:11:00

                      lucasdom a écrit:

                      merci, ça fonctionne avec NOW() 

                      ça fonctionne très bien mais.... 

                      un problème dont je n'ai aucune idée sur la manière de le résoudre, pour obtenir l'écart il suffit de soustraire le mini du maxi, ça je sais faire et j'obtiens l'écart. Cependant si cet écart m'intéresse c'est parce que je souhaite voir si au fil des 3 heures  si l'écart est en plus ou en moins. exemple :

                      à 10h pression à 1000 hPa

                      à 13h pression à 1003 hPa

                      écart = + 3hPa en 3h

                      à 15h pression à 990 hPa

                      à 18h pression à 980 HPa

                      écart = - 10 hPa en 3h (avis de fort coup de vent) 

                      comment je peux savoir si l'écart est en positif ou négatif ? peut être en associant la valeur mini et maxi à l'heures du relevés ? 

                      -
                      Edité par lucasdom hier à 10:46

                      personne aurait une idée ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 juin 2019 à 0:21:22

                        Tu ne veux donc pas calculer l'écart entre le mini et le maxi, mais l'écart entre la dernière mesure et la mesure 3h avant ...

                        C'est bien ça ?

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                          15 juin 2019 à 9:09:01

                          Benzouye a écrit:

                          Tu ne veux donc pas calculer l'écart entre le mini et le maxi, mais l'écart entre la dernière mesure et la mesure 3h avant ...

                          C'est bien ça ?


                          je pense que dés le départ je me suis mal expliqué sûrement, mais c'est exactement ce que tu dit :

                          c'est l'écart entre la dernière mesure et la mesure 3h avant, l'écart peut être positif ou négatif et cette variation a une incidence sur la prévision si l'écart est important.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 juin 2019 à 16:21:59

                            Alors je te propose de fonctionner en deux requêtes.

                            La première pour récupérer la mesure d'il y a trois heures :

                            SELECT bar
                            FROM mesure
                            WHERE tstamp <= NOW() - INTERVAL 3 HOUR
                            ORDER BY tstamp DESC
                            LIMIT 1

                            La deuxième pour récupérer la dernière mesure :

                            SELECT bar
                            FROM mesure
                            ORDER BY tstamp DESC
                            LIMIT 1

                            En combinant les deux tu as l'écart souhaité :

                            SELECT
                            	(
                            		-- Dernière mesure
                            		SELECT bar
                            		FROM mesure
                            		ORDER BY tstamp DESC
                            		LIMIT 1
                            	) - (
                            		-- Mesure il y a 3 heures
                            		SELECT bar
                            		FROM mesure
                            		WHERE tstamp <= NOW() - INTERVAL 3 HOUR
                            		ORDER BY tstamp DESC
                            		LIMIT 1
                            	) AS ecart;

                            -
                            Edité par Benzouye 15 juin 2019 à 16:22:55

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                              15 juin 2019 à 23:03:44

                              Merci Benzouye !

                              vite fait voici ce que ça donne : https://www.meteo-canejan.fr/bar.php  

                              j'ai volontairement changé les valeurs de pression et le script accuse bien chaque changement.

                              merci encore de ta patience :) 

                              • Partager sur Facebook
                              • Partager sur Twitter

                              écart sur 3h d'enregistrement

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown