Select solo i record con MAX(data) e MAX(ora)

di il
3 risposte

Select solo i record con MAX(data) e MAX(ora)

Ciao a tutti, sono alle prese con una query, ma non sono riuscito a risolvere completamente.
In una tabella desidero prelevare solo i record dove data e ora corrispondono all'ultima data e ora di tutti i record inseriti per ogni id_com. (Vedi GROUP BY id_com nella query)

Questa è la mia tabella:

CREATE TABLE `miatable` (
  `id` int(11) NOT NULL,
  `id_com` int(11) NOT NULL,
  `data` date NOT NULL,
  `ora` time NOT NULL,
  `stato_com` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Questa è la query che ho provato a formulare:

SELECT DISTINCT miatable.id_com, miatable.stato_com, miatable.data, miatable.ora FROM miatable
INNER JOIN
(SELECT MAX(data) AS ListaDate FROM miatable GROUP BY id_com) AS ItemData
ON ItemData.ListaDate = miatable.data
INNER JOIN
(SELECT MAX(ora) AS ListaOra FROM miatable GROUP BY id_com) AS ItemOra
ON ItemOra.ListaOra = miatable.ora
ORDER BY id_com ASC;
Ma non è corretta in quanto mi estrae anche altri record non richiesti.

id_com	stato_com	data		ora
1 	Terminato 	2021-03-12 	19:14:05
2 	Terminato 	2021-03-12 	19:10:02
3 	Terminato 	2021-03-15 	10:50:32
4 	Terminato 	2021-03-15 	18:01:31
5 	In Pausa	2021-03-15 	15:42:16
6 	Terminato 	2021-03-15 	12:15:33
7 	In Pausa	2021-03-15 	10:29:53
8 	In Pausa	2021-03-15 	15:38:29
10 	In Pausa 	2021-03-15 	17:54:45
In particolare il record con id_com = 8 se guardo i dati, vedo che l'ultima data è il 2021-03-16 e non il 2021-03-15, mentre il campo ora è corretto. In pratica questa query non soddisfa entrambe le condizioni MAX(data) && MAX(ora) richieste.
Qualcuno mi sa dare qualche consiglio per capire come formulare la query in modo corretto?
Se dovesse servire il dump dei dati, lo potrei inviare anche tramite email.

Grazie anticipatamente
blackout69

3 Risposte

  • Re: Select solo i record con MAX(data) e MAX(ora)

    Ciao

    Secondo me stai sbagliando a livello logico.
    Prendere MAX(data) e MAX(ora) separatamente non ha senso, poichè l'informazione è una sola (data/ora) che hai diviso in due campi per comodità tua (o perchè erano così storicamente).

    Tanto per fare un esempio, supponi di avere, a parità di id_com e stato_com, i seguenti valori:
    - 2021-12-20 23:30:15
    - 2021-12-21 14:30:21

    Probabilmente a te interessa il secondo record (21 dicembre) poichè è l'ultimo stato della commessa. Se però prendi il MAX(data) e il MAX(ora) avresti un 2021-12-21 23:30:15 che probabilmente non avrebbe alcun senso.

    Pertanto ti consiglio di concatenare data/ora in un unico campo di tipo datetime e quindi fare la banale query con GroupBy e max.

    Scrivo qualcosa al volo per darti un'idea:
    
    
    SELECT id_com, stato_com, MAX(concatena(data, ora))
    FROM miatable
    GROUP BY id_com, stato_com
    
  • Re: Select solo i record con MAX(data) e MAX(ora)

    Ma non puoi mettere data ed ora in unico campo datetime invece di due campi separati ?
  • Re: Select solo i record con MAX(data) e MAX(ora)

    Ciao e grazie per la risposta,
    i campi della tabella sono separati perchè inizialmente non serviva averli come datatime.
    Ho provato a seguire il consiglio di PiGi78 concatenando i campi data e ora così:
    
    SELECT id_com, data, ora, stato_com FROM miatable WHERE CONCAT(data,' ',ora) IN(SELECT MAX(CONCAT(data,' ',ora)) FROM miatable GROUP BY id_com) ORDER BY id_com
    
    Così funziona!
    Effettivamente non aveva senso estrarre i record con i campi data e ora separati.

    Grazie per la dritta.
    blackout69
Devi accedere o registrarti per scrivere nel forum
3 risposte