recherche

Maison  >  Questions et réponses  >  le corps du texte

Extraire les différences de valeurs consécutives dans MySQL 5.7

Nom Date heures Comptage
Moulins 2022-07-17 23 12
Moulins 2022-07-18 00 15
Moulins 2022-07-18 01 20
Moulins 2022-07-18 02 22
Moulins 2022-07-18 03 25
Moulins 2022-07-18 04 20
Moulins 2022-07-18 05 22
Moulins 2022-07-18 06 25
Mike 2022-07-18 00 15
Mike 2022-07-18 01 20
Mike 2022-07-18 02 22
Mike 2022-07-18 03 25
Mike 2022-07-18 04 20

Ma table de saisie actuelle stocke les informations de comptage enregistrées en continu à chaque heure de la journée. Je dois extraire la différence des valeurs de comptage consécutives, mais comme je suis obligé d'utiliser MySQL 5.7, j'ai du mal à le faire.

La requête que j'ai écrite est la suivante :

SET @cnt := 0;
SELECT Name, Date, Hours, Count, (@cnt := @cnt - Count) AS DiffCount
FROM Hourly
ORDER BY Date;

Cela ne donne pas de résultats précis.

J'aimerais obtenir le résultat suivant :

Nom Date heures Comptage Différence
Moulins 2022-07-17 23 12 0
Moulins 2022-07-18 00 15 3
Moulins 2022-07-18 01 20 5
Moulins 2022-07-18 02 22 2
Moulins 2022-07-18 03 25 3
Moulins 2022-07-18 04 20 5
Moulins 2022-07-18 05 22 2
Moulins 2022-07-18 06 25 3
Mike 2022-07-18 00 15 0
Mike 2022-07-18 01 20 5
Mike 2022-07-18 02 22 2
Mike 2022-07-18 03 25 3
Mike 2022-07-18 04 20 5
Mike 2022-07-18 05 22 2
Mike 2022-07-18 06 25 3

Veuillez suggérer ce qui me manque.

P粉216807924P粉216807924232 Il y a quelques jours395

répondre à tous(2)je répondrai

  • P粉771233336

    P粉7712333362024-04-02 13:49:18

    Essayez ce qui suit :

    SET @count=(select Count_ from Hourly order by Name,Date_,Hours LIMIT 1);
    Set @Name=(select Name from Hourly order by Name,Date_,Hours LIMIT 1);
    
    select  Name,Date_,Hours,Count_,
    ABS(curr_count-lag_count) as DiffCount
    From
    (
      select Name,Date_,Hours,Count_, 
      Case When @Name = Name Then @count Else Count_ End as lag_count
      , @count:=Count_ curr_count, @Name:=Name
      From Hourly order by Name,Date_,Hours
    ) D
    Order By Name,Date_,Hours;

    Découvrez la démo de db-fiddle.

    répondre
    0
  • P粉569205478

    P粉5692054782024-04-02 11:29:09

    Dans MySQL 5.7, vous pouvez mettre à jour une variable en ligne pour contenir la valeur "Count" mise à jour. Puisque vous devez réinitialiser la variable lorsque la valeur de "Nom" change, vous pouvez utiliser une autre variable contenant la valeur précédente de "Nom". Utilisez ensuite la fonction IF pour vérifier :

    • Si votre ancien nom est le même que votre nom actuel
    • Calculez ensuite la différence de comptage
    • Sinon, attribuez 0

    Cela fonctionnera avec la fonction ABS, appliquant la valeur absolue à la différence.

    SET @cnt  := NULL;
    SET @name := NULL;
    
    SELECT Date,
           Hours,
           ABS(IF(@name = Name, 
                  @cnt := @cnt - Count,
                  0)                    ) AS DiffCount,
           (@name := Name)                AS Name,
           (@cnt := Count)                AS Count
    FROM tab
    ORDER BY Name DESC,
             Date, 
             Hours;

    Voir la démo ici.


    Dans MySQL 8.0, vous pouvez utiliser quelque chose comme LAG pour obtenir une sortie fluide. Cela fonctionnera avec :

    • ABS Appliquer la valeur de différence absolue,
    • COALESCE est utilisé pour supprimer la première valeur nulle.
    SELECT *, 
           COALESCE(ABS(
               Count - LAG(Count) OVER(
                           PARTITION BY Name
                           ORDER     BY Date, Hours
                       )
           ), 0) AS Diff 
    FROM tab
    ORDER BY Name DESC, 
             Date, 
             Hours

    Voir la démo ici.

    répondre
    0
  • Annulerrépondre