optime!![]()
optime!![]()
E se l'intento fosse (come in realtà è) semplicemente quello di aggiungere un campo ULTIMO che distingue attribuendo semplicemente anche un VALORE 'SI' o un 'NO' a seconda che siano gli ultimi record (ordinati per data) raggruppati per identificativo?
Esempio:
dalla solita tabella del tipo di cui sopra:
id_______data_______identificativo_______altro1___ ____altro2
1_____10/08/22________1234___________aaaa________yyyy
2_____12/01/24________1100___________bbbb________cccc
3_____15/11/23________8333___________dddd________rrrr
4_____13/05/24________1100___________cccc________tttt
5_____17/01/24________1234___________zzzz________iiii
6_____12/03/25________9465___________yyyy________ssss
7_____21/02/28________1234___________xxxx________kkkk
8_____08/10/24________8333___________zzzz________qqqq
restituisse la medesima tabella con il campo ULTIMO:
id_______data_______identificativo_______altro1___ ____altro2___ ____ULTIMO
1_____10/08/22________1234___________aaaa________yyyy_________ _NO
2_____12/01/24________1100___________bbbb________cccc_________ _NO
3_____15/11/23________8333___________dddd________rrrr_________ _NO
4_____13/05/24________1100___________cccc________tttt_________ _SI
5_____17/01/24________1234___________zzzz________iiii_________ _NO
6_____12/03/25________9465___________yyyy________ssss_________ _SI
7_____21/02/28________1234___________xxxx________kkkk_________ _SI
8_____08/10/24________8333___________zzzz________qqqq_________ _SI
Prima o poi anch'io vi insegnerò qualcosa
fai la prima query (quella che ti ricava gli ultimi), poi la metti in JOIN (a destra) con la query complessiva, tramite l'ID. Dove l'ID corrisponde, quello è l'ultimo
vedi se ti va bene con un passo in piu'
ammesso che id rispetti l'ordine temporale di inserimento nella tabella
valore piu' alto inserimento piu' recente
codice:select t3.identificativo , t3.data , t3.id , t4.altro1 , t4.altro2 from (select t1.identificativo , t1.data , max(t2.id) as id from (select identificativo, max(data) as data from tabella group by identificativo) t1 left join tabella t2 on t1.identificativo = t2.identificativo and t1.data = t2.data group by t1.identificativo, t1.data ) t3 left join tabella t4 on t3.identificativo = t4.identificativo and t3.data = t4.data and t3.id = t4.id order by t3.data desc, t3.identificativocodice:tabella 12 2024-05-13 1100 a12 b12 4 2024-05-13 1100 a4 b4 2 2024-01-12 1100 a2 b2 7 2028-02-21 1234 a7 b7 5 2024-01-17 1234 a5 b5 1 2022-08-10 1234 a1 b1 13 2024-10-08 8333 a13 b13 8 2024-10-08 8333 a8 b8 3 2023-11-15 8333 a3 b3 6 2025-03-12 9465 a6 b6 99 9999-12-31 9999 a99 b99 risultato 9999 9999-12-31 99 a99 b99 1234 2028-02-21 7 a7 b7 9465 2025-03-12 6 a6 b6 8333 2024-10-08 13 a13 b13 1100 2024-05-13 12 a12 b12
Ultima modifica di marino51; 23-03-2025 a 14:48
Cambiata quindi la mia esigenza nell'elencare tutti i record ma identificare facilmente gli identificativi che hanno data più alta, e testati vari suggerimenti, ho risolto così:
SELECT
`identificativo` AS `IDENTIFICATIVO`,
`data` AS `DATA`,
`id` AS `ID`,
`altro1` AS `ALTRO1`,
`altro2` AS `ALTRO2`,
ROW_NUMBER() OVER(PARTITION BY `identificativo` ORDER BY `data` DESC) AS `NUMERAZIONE_PER_GRUPPO`
FROM `tabella`
ORDER BY `data` DESC
Mi è sembrata la soluzione più semplice (tutti i record con la `NUMERAZIONE_PER_GRUPPO` = 1 sono i record con data più alta).
Qualche controindicazione?
Ultima modifica di riccardo1975; 27-03-2025 a 16:13
Prima o poi anch'io vi insegnerò qualcosa
nel mio ultimo post, puoi vedere la tua tabella
con l'aggiunta di due elementi doppi, rispettivamente gli id 12 e 13
gli id più alti (auto numerazione) dovrebbero identificare le righe inserite nella tabella per ultime
con la tua ultima query non selezioni gli ultimi inserimenti a parità di identificativo e data
se ho capito bene, non rispetti la necessità di estrarre gli ultimi record inseriti per ciascun gruppocodice:1234 2028-02-21 7 a7 b7 1 9465 2025-03-12 6 a6 b6 1 8333 2024-10-08 8 a8 b8 1 8333 2024-10-08 13 a13 b13 2 1100 2024-05-13 4 a4 b4 1 1100 2024-05-13 12 a12 b12 2 1234 2024-01-17 5 a5 b5 2 1100 2024-01-12 2 a2 b2 3 8333 2023-11-15 3 a3 b3 3 1234 2022-08-10 1 a1 b1 3
potresti aggiungere
ORDER BY data DESC, id DESC
per ottenere
codice:1234 2028-02-21 7 a7 b7 1 9465 2025-03-12 6 a6 b6 1 8333 2024-10-08 13 a13 b13 1 <---- 8333 2024-10-08 8 a8 b8 2 1100 2024-05-13 12 a12 b12 1 <---- 1100 2024-05-13 4 a4 b4 2 1234 2024-01-17 5 a5 b5 2 1100 2024-01-12 2 a2 b2 3 8333 2023-11-15 3 a3 b3 3 1234 2022-08-10 1 a1 b1 3
Perdonami non riesco a capire che cosa non torna. Mi pare che almeno nell'esempio tutto fili liscio
Prima o poi anch'io vi insegnerò qualcosa
tutto va bene se non ci sono combinazioni doppie di identificativo-data
nel caso invece dovesse esistere la condizione, non é garantito che il record estratto sia l'ultimo inserito
confronta il risultato della tua query con e senza "ORDER BY ..... id DESC"
in particolare nel mio esempio controlla id 12 e 13
poi decidi secondo la tua fattispecie