PDA

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

idoido
07-03-2013, 09:53
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?

idoido
07-03-2013, 10:21
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 :)

idoido
07-03-2013, 11:22
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ù