Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment puis-je obtenir la différence entre les valeurs maximales individuelles de différents jours ?

Mise à jour 1 :Voici un violon, http://sqlfiddle.com/#!2/818ad /2 , que j'ai utilisé pour tester.
Mise à jour 2 :Voici un violon, http ://sqlfiddle.com/#!2/3f78d/10 que j'ai utilisé pour affiner/corriger davantage, sur la base des commentaires de Sandy.
Mise à jour 3 :pour une raison quelconque, le cas où il n'y a pas de jour précédent n'était pas traité correctement. Je croyais que c'était. Cependant, j'ai mis à jour pour m'assurer que cela fonctionne (un peu lourd - mais cela semble être correct. Dernier violon :http://sqlfiddle.com/#!2/3f78d/45

Je pense que @Grijesh vous a conceptuellement fourni la principale chose dont vous aviez besoin via l'auto-jointure des données d'entrée (assurez-vous donc de voter pour sa réponse!). J'ai un peu nettoyé sa requête sur la syntaxe (en s'inspirant de sa requête !) :

SELECT
DATE(t1.`Production_date`) as theDate,
MAX( t1.`bundle_count` ) AS  'max(bundle_count)',
MAX( t1.`bundle_count` ) - 
    IF(
       EXISTS
           (
            SELECT date(t2.production_date)
            FROM input_example t2
            WHERE t2.machine_no = 1 AND 
                  date_sub(date(t1.production_date), interval 1 day) = date(t2.production_date)
        ),
        (
            SELECT MAX(t3.bundle_count)
            FROM input_example t3
            WHERE t3.machine_no = 1 AND 
                  date_sub(date(t1.production_date), interval 1 day) = date(t3.production_date)
            GROUP BY DATE(t3.production_date)
        ),          0
    )
    AS Total_Bundles_Used
FROM  `input_example` t1
WHERE t1.machine_no = 1
GROUP BY DATE( t1.`production_date` )      

Note 1 :Je pense que @Grijesh et moi étions en train de nettoyer les problèmes de syntaxe de requête en même temps. Il est encourageant que nous nous soyons retrouvés avec des versions très similaires après que nous ayons tous les deux fait le ménage. Ma version diffère en utilisant IFNULL() pour quand il n'y a pas de données précédentes. Je me suis également retrouvé avec un DATE_SUB , et je me suis assuré de réduire diverses dates à de simples dates sans composante temporelle, via DATE()

Remarque 2 :Au départ, je n'avais pas entièrement compris vos tables source, j'ai donc pensé que je devais implémenter un décompte courant dans la requête. Mais après une meilleure inspection, il est clair que vos données source ont déjà un décompte, alors j'ai retiré ce truc.