Maison > Questions et réponses > le corps du texte
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粉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.
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 :
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.