MySQL : Calcul des différences de consommation d'énergie entre les lignes consécutives par numéro de série (SN)
Ce document présente une méthode pour calculer la différence de consommation d'énergie entre des lignes consécutives dans une base de données MySQL, regroupées par numéro de série (SN).
Problème :
À partir d'un tableau contenant des données de consommation d'énergie, l'objectif est de calculer la différence de consommation pour chaque SN, représentant le changement entre la valeur actuelle et la valeur précédente pour ce SN spécifique.
Exemples de données :
Le tableau suivant (EnergyLog
) illustre la structure initiale des données :
SN | Date | Value |
---|---|---|
2380 | 2012-10-30 00:15:51 | 21.01 |
2380 | 2012-10-31 00:31:03 | 22.04 |
2380 | 2012-11-01 00:16:02 | 22.65 |
2380 | 2012-11-02 00:15:32 | 23.11 |
20100 | 2012-10-30 00:15:38 | 35.21 |
20100 | 2012-10-31 00:15:48 | 37.07 |
20100 | 2012-11-01 00:15:49 | 38.17 |
20100 | 2012-11-02 00:15:19 | 38.97 |
20103 | 2012-10-30 10:27:34 | 57.98 |
20103 | 2012-10-31 12:24:42 | 60.83 |
Sortie souhaitée :
La requête doit produire une table avec une colonne Consumption
ajoutée :
SN | Date | Value | Consumption |
---|---|---|---|
2380 | 2012-10-30 00:15:51 | 21.01 | 0.00 |
2380 | 2012-10-31 00:31:03 | 22.04 | 1.03 |
2380 | 2012-11-01 00:16:02 | 22.65 | 0.61 |
2380 | 2012-11-02 00:15:32 | 23.11 | 0.46 |
20100 | 2012-10-30 00:15:38 | 35.21 | 0.00 |
20100 | 2012-10-31 00:15:48 | 37.07 | 1.86 |
20100 | 2012-11-01 00:15:49 | 38.17 | 1.10 |
20100 | 2012-11-02 00:15:19 | 38.97 | 0.80 |
20103 | 2012-10-30 10:27:34 | 57.98 | 0.00 |
20103 | 2012-10-31 12:24:42 | 60.83 | 2.85 |
Solution SQL :
La requête SQL suivante utilise des variables définies par l'utilisateur pour obtenir le résultat souhaité :
<code class="language-sql">SELECT EL.SN, EL.Date, EL.Value, IF(@lastSN = EL.SN, EL.Value - @lastValue, 0.00) AS Consumption, @lastSN := EL.SN, @lastValue := EL.Value FROM EnergyLog EL, (SELECT @lastSN := 0, @lastValue := 0) AS SQLVars ORDER BY EL.SN, EL.Date;</code>
Explication :
@lastSN
et @lastValue
: ce sont des variables définies par l'utilisateur initialisées à 0. @lastSN
suit le dernier SN traité et @lastValue
stocke la dernière valeur traitée.IF(@lastSN = EL.SN, EL.Value - @lastValue, 0.00)
: Cette instruction conditionnelle vérifie si le SN actuel est le même que le SN précédent. Si c'est vrai, il calcule la différence de consommation ; sinon, il fixe la consommation à 0,00 (pour la première entrée de chaque SN).@lastSN := EL.SN, @lastValue := EL.Value
: Ces affectations mettent à jour les variables définies par l'utilisateur après le traitement de chaque ligne.ORDER BY EL.SN, EL.Date
: Cette clause garantit que les lignes sont traitées dans le bon ordre (par SN puis par date) pour des calculs de différence précis.Cette approche calcule efficacement la différence de consommation d'énergie pour chaque SN en tirant parti des capacités de gestion des variables de MySQL. L'utilisation de ORDER BY
est cruciale pour l'exactitude des résultats.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!