Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como posso obter a diferença entre os valores máximos individuais de dias diferentes?


Atualização 1:aqui está um violino, http://sqlfiddle.com/#!2/818ad /2 , que usei para testar.
Atualização 2:Aqui está um violino, http://sqlfiddle.com/#!2/3f78d/10 que usei para refinar/consertar ainda mais, com base nos comentários de Sandy.
Atualização 3:Por algum motivo, o caso em que não há dia anterior não estava sendo tratado corretamente. Eu pensei que era. No entanto, atualizei para ter certeza de que funciona (um pouco complicado - mas parece estar certo. Último violino:http://sqlfiddle.com/#!2/3f78d/45

Eu acho que @Grijesh conceitualmente deu a você a principal coisa que você precisava através da auto-junção dos dados de entrada (portanto, certifique-se de votar na resposta dele!). Eu limpei sua consulta um pouco na sintaxe (construindo a partir de sua consulta!):
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` )      

Nota 1:acho que @Grijesh e eu estávamos limpando os problemas de sintaxe de consulta ao mesmo tempo. É encorajador que acabamos com versões muito semelhantes depois de fazermos a limpeza. Minha versão difere em usar IFNULL() para quando não houver dados anteriores. Também acabei com um DATE_SUB , e certifiquei-me de reduzir várias datas para meras datas sem componente de tempo, via DATE()

Nota 2:Originalmente, eu não tinha entendido completamente suas tabelas de origem, então pensei que precisava implementar uma contagem em execução na consulta. Mas após uma inspeção melhor, fica claro que seus dados de origem já têm uma contagem em execução, então retirei essas coisas.