Boa noite,
Preciso gerar uma consulta SQL que traga o melhor tempo entre registros de uma única tabela, exemplo:
Minha tabela:
CREATE TABLE `mesaproducao` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`codProducao` INT(11) NOT NULL,
`mesaProducao` VARCHAR(50) NOT NULL,
`pn` VARCHAR(50) NOT NULL,
`descricao` VARCHAR(50) NOT NULL,
`multiplo` INT(11) NOT NULL,
`tipo` VARCHAR(50) NOT NULL,
`lote` VARCHAR(50) NOT NULL,
`bip` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
)
Abaixo explicado e destacado de verde o que quero trazer com este SELECT:
Não sei se MySql tem a função Rank nativa como nos grandes bancos, mas pesquise sobre Rank, exemplo: https://stackoverflow.com/questions/3333665/rank-function-in-mysql
Com isto, basta colocar no where se a colocação é igual a 1.
-
Para achar o tempo anterior, você pode incluir uma subquery, que busca para o mesmo PN, o maior bip que seja menor o bip da linha atual.
-
Depois você subtrai o bip atual desse menor bip encontrado.
-
Depois você orderna por pn e pela diferença encontrada na linha anterior.
-
Para saber o PN e o melhor tempo coletado, aagrupe o resultado anterior por PN e buscar a mínima diferença.
Algo assim:
select
*,
bip - previous_bip diff
from
(
select *,
(select max(bip) min_bip
from mesaproducao mpi
where mpi.pn = mp.pn
and mpi.bip < mp.bip
) previous_bip
from mesaproducao mp
) t_previous
Obrigado pela ajuda pessoal, segue solução, desta forma exporto para Excel e faço um pouco diferente, vou calcular a média e não o menor tempo, assim terei o resultado esperado:
/*Retorna a diferença em segundos, de um Bip para Outro*/
SELECT
reg_atual.pn,
reg_atual.descricao,
reg_anterior.bip AS bipInicial,
reg_atual.bip AS bipFinal,
TIMEDIFF(STR_TO_DATE(reg_atual.bip, '%d/%m/%Y %H:%i:%s'), STR_TO_DATE(reg_anterior.bip, '%d/%m/%Y %H:%i:%s')) as tempo
FROM
mesaproducao AS reg_atual
LEFT JOIN
mesaproducao AS reg_anterior
ON reg_anterior.id < reg_atual.id
GROUP BY reg_anterior.id