Extraire les différences de valeurs consécutives dans MySQL 5.7
P粉216807924
P粉216807924 2024-04-01 15:51:07
0
2
435

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粉216807924
P粉216807924

répondre à tous(2)
P粉771233336

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.

P粉569205478

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 a>, 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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal