View Full Version : [SQL] Estrarre l'ultima tupla per ciascun gruppo
swarzy85
07-03-2013, 09:45
Ciao ragazzi,
vi presento uno schema molto semplificato del DB sul quale devo lavorare. Immaginate che si tratti di un elenco di eventi per ciascuna partita di calcio e che ogni partita abbia un proprio ID univoco.
ID_PARTITA .... DATA_EVENTO
Il campo ID_PARTITA è numerico, mentre DATA_EVENTO è di tipo DATETIME (data e ora).
A me interessa estrarre PER OGNI PARTITA l'ultimo evento in ordine temporale. Per ultimo evento intendo TUTTA LA TUPLA, non solo la data.
Pensavo di riuscire a risolvere semplicemente così:
SELECT *
FROM EVENTI_PARTITE
GROUP BY ID_PARTITA, DATA_EVENTO DESC LIMIT 1
Ma nada da fare, mi estrae unicamente l'ultimo evento di tutto il DB.
Tenete presente che la tabella ha circa 10 milioni di tuple.
Grazie anticipatamente
intanto dovresti spiegare meglio la struttura del db, ho dovuto rileggere 3 volte.
da quello che ho capito hai la tabella in questo modo:
ID_PARTITA | DATA_EVENTO | CAMPO1 | ...
1 | 05/03/2013 | x
1 | 06/03/2013 | y
1 | 04/03/2013 | z
2 | 01/01/2013 | a
2 | 02/01/2013 | b
e tu vorresti che fossero restituiti questi dati:
ID_PARTITA | DATA_EVENTO | CAMPO1 | ...
1 | 06/03/2013 | y
2 | 02/01/2013 | b
nella tua query è normale che ti esca un solo risultato visto che hai messo LIMIT 1
per ora ci penso, ma almeno se altri leggono è più chiaro :stordita:
swarzy85
07-03-2013, 10:02
Esattamente :)
Tutto corretto :)
In pratica dovrei riuscire a raggruppare per ID_PARTITA e a trovare la tupla col valore massimo della DATA_EVENTO
The_ouroboros
07-03-2013, 10:07
giocare con having?
dovresti risolvere con questa query:
SELECT * FROM EVENTI_PARTITE
AS EVENTI
INNER JOIN
(SELECT ID_PARTITA AS ULTIMO_ID_PARTITA, MAX(DATA_EVENTO) AS ULTIMO_EVENTO FROM EVENTI_PARTITE GROUP BY ID_PARTITA)
AS ULTIMI_EVENTI
ON EVENTI.ID_PARTITA = ULTIMI_EVENTI.ULTIMO_ID_PARTITA AND EVENTI.DATA_EVENTO = ULTIMI_EVENTI.ULTIMO_EVENTO
swarzy85
07-03-2013, 10:22
giocare con having?
Intanto ti ringrazio per la risposta :)
intendi qualcosa di simile?
SELECT *
FROM EVENTI_PARTITE
GROUP BY ID_PARTITA
HAVING [...]
Il problema è che non riesco ad estrarre la data "massima" per ogni gruppo
swarzy85
07-03-2013, 10:28
dovresti risolvere con questa query:
SELECT * FROM EVENTI_PARTITE
AS EVENTI
INNER JOIN
(SELECT ID_PARTITA AS ULTIMO_ID_PARTITA, MAX(DATA_EVENTO) AS ULTIMO_EVENTO FROM EVENTI_PARTITE GROUP BY ID_PARTITA)
AS ULTIMI_EVENTI
ON EVENTI.ID_PARTITA = ULTIMI_EVENTI.ULTIMO_ID_PARTITA AND EVENTI.DATA_EVENTO = ULTIMI_EVENTI.ULTIMO_EVENTO
Ti ringrazio, provo subito :)
swarzy85
07-03-2013, 11:03
dovresti risolvere con questa query:
SELECT * FROM EVENTI_PARTITE
AS EVENTI
INNER JOIN
(SELECT ID_PARTITA AS ULTIMO_ID_PARTITA, MAX(DATA_EVENTO) AS ULTIMO_EVENTO FROM EVENTI_PARTITE GROUP BY ID_PARTITA)
AS ULTIMI_EVENTI
ON EVENTI.ID_PARTITA = ULTIMI_EVENTI.ULTIMO_ID_PARTITA AND EVENTI.DATA_EVENTO = ULTIMI_EVENTI.ULTIMO_EVENTO
Statuetta per te :)
Pensavo impiegasse una vita, visto il JOIN, invece me la esegue in pochissimi secondi.
Grazie mille :)
Statuetta per te :)
Pensavo impiegasse una vita, visto il JOIN, invece me la esegue in pochissimi secondi.
Grazie mille :)
perfetto, riguardo le prestazioni è una inner join, fosse stata una outer join avrebbe impiegato di più
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.