PDA

View Full Version : [SQL] Rimuovere tuple parzialmente duplicate


swarzy85
14-03-2013, 15:48
Ciao ragazzi, ho una tabella approssimabile come segue:

ID_ PARTITA (int) | ID_GIOCATORE (int) | EVENTO (varchar) | ORARIO (datetime)

Purtroppo mi capitano dei casi del tipo:

ID_ PARTITA | ID_GIOCATORE | EVENTO | ORARIO
Z | X | Corre | 2012-09-05 15:26:51
Z | Y | Corre | 2012-09-05 15:26:51

In pratica, mi succede che nello stesso istante due giocatori diversi facciano la stessa cosa e che dunque esistano due tuple parzialmente duplicate.
Io sono interessato a mantenere tra le due o le tre parzialmente duplicate ESCLUSIVAMENTE quella che compare per ultima all'interno del database.
Ad esempio, rispetto al caso che ho prospettato, voglio mantenere solo

Z | Y | Corre | 2012-09-05 15:26:51

più chiaramente tutte le altre. Semplicemente, quando ci sono dei casi come quello indicato, voglio tenere l'ultima.

Come potrei fare?
Grazie anticipatamente.

Alberto

The_ouroboros
14-03-2013, 16:07
group by* ?




una cosa tipo select ID_PARTITA, max(ID_GIOCATORE), EVENTO, ORARIO group by ORARIO

swarzy85
14-03-2013, 16:38
Ciao, grazie per la risposta :)

Non ho capito cosa intendi precisamente.
Con la query che hai scritto, dovrei visualizzare esattamente ciò che vedo, raggruppando per altro per orario.

Probabilmente non mi son spiegato chiaramente. Io devo proprio ELIMINARE delle tuple. Presento di seguito un esempio più calzante:

ID_ PARTITA | ID_GIOCATORE | EVENTO | ORARIO
A | T | Tira | 2012-09-05 13:20:41
C | U | Passa | 2012-09-05 13:48:23
D | L | Parla con l'arbitro | 2012-09-05 13:52:06
D | N | Parla con l'arbitro | 2012-09-05 13:52:06
G | W | Tira | 2012-09-05 14:08:47
Z | X | Corre | 2012-09-05 15:26:51
Z | Y | Corre | 2012-09-05 15:26:51

In tal caso, rispetto ai due insiemi di tuple indicati, dovrei lasciare sempre e solo l'ultima tupla, ottenendo la seguente tabella:

ID_ PARTITA | ID_GIOCATORE | EVENTO | ORARIO
A | T | Tira | 2012-09-05 13:20:41
C | U | Passa | 2012-09-05 13:48:23
D | N | Parla con l'arbitro | 2012-09-05 13:52:06
G | W | Tira | 2012-09-05 14:08:47
Z | Y | Corre | 2012-09-05 15:26:51

The_ouroboros
14-03-2013, 16:45
ID_GIOCATORE sono successivi?

swarzy85
14-03-2013, 16:53
Purtroppo no, sono casuali e non c'è alcuna relazione di ordine.

Adesso ho pensato di aggiungere un campo autoincrementale nella tabella, di raggruppare per ID_PARTITA e ORARIO e di usare ASC LIMIT 1 per selezionare solo l'ultima.
Adesso provo subito se va :)

swarzy85
14-03-2013, 17:17
Risolto tramite l'aggiunta del campo incrementale, raggruppando e poi usando nell'having l'operatore MAX :)